WCF身份验证及无法找到 X.509 证书的终极解决方案 (已测试可以用)

WCF身份验证及无法找到 X.509 证书的终极解决方案 (已测试可以用)

最近在想WCF身份验证,可遇到不少问题.

在网上看了不少文章都是讲证书验证的,还是照样先生成证书吧

makecert -sr LocalMachine -ss My -n CN=MyServer -sky exchange -pe

注意,这里可能会出现如下类似的错误 Error: Can't create the key of the subject ( ' bd4f5866-b309-42b6-b58b-8ba355ddbac5 ' ) Failed

解决办法就是先给"C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys"

这个文件夹某些用户的权限,如network service,aspnet,iusr_machinename等

你可以进入证书管理控件台(在mmc中添加"证书"控制单元)查看证书是否成功添加

如果证书为不信任证书,你可将生成的证书导出一份后导入到"受信任的根证书颁发机构"中.

到此证书已生成好了

1.先写个WCF服务吧     代码   [ServiceContract] public interface IRSQLHepler { [OperationContract] object GetSingle(string SQLString); [OperationContract] int ExecuteSql(string SQLString); [OperationContract] DataSet Query(string strSQL, CommandType cmdType, params SqlParameter[] parameters); } public class RSQLHepler : IRSQLHepler {  public int ExecuteSql(string SQLString) { }  public object GetSingle(string SQLString) { }  public DataSet Query(string strSQL, CommandType cmdType, params SqlParameter[] parameters) { } }

2.想采用用户身份验证,实现抽象类UserNamePasswordValidator

public class CustomUserPassword : UserNamePasswordValidator {  public override void Validate(string userName, string password) { } }

3.服务器配置

<system.serviceModel>
  <bindings>
    <wsHttpBinding>
      <binding name="EndpointBinding">
        <security mode="Message">
          <transport clientCredentialType="None" />
          <message clientCredentialType="UserName" />
        </security>
      </binding>
    </wsHttpBinding>
  </bindings>
  <services>
    <service behaviorConfiguration="RemoteSQLHelper.RSQLHeplerBehavior"
    name="RemoteSQLHelper.RSQLHepler">
      <endpoint address="" binding="wsHttpBinding" contract="RemoteSQLHelper.IRSQLHepler" bindingConfiguration="EndpointBinding">
        <identity>
          <dns value="MyServer" />
        </identity>
      </endpoint>
      <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    </service>
  </services>
  <behaviors>
    <serviceBehaviors>
      <behavior name="RemoteSQLHelper.RSQLHeplerBehavior">
        <!-- To receive fault exceptions as detailed error messages, set the following value to true. Set to false before deployment to avoid leaking exception information -->
        <serviceDebug includeExceptionDetailInFaults="true" />
        <serviceCredentials>
          <clientCertificate>
            <authentication certificateValidationMode="None" />
          </clientCertificate>
          <serviceCertificate findValue="MyServer"
          storeLocation="LocalMachine"
          x509FindType="FindBySubjectName" />
          <userNameAuthentication userNamePasswordValidationMode="Custom"
          customUserNamePasswordValidatorType="RemoteSQLHelper.CustomUserPassword, RemoteSQLHelper" />
        </serviceCredentials>
      </behavior>
    </serviceBehaviors>
  </behaviors>
</system.serviceModel>

到此wcf服务已完成.

4.客户端调用

RSQLHeplerClient client = new RSQLHeplerClient();
client.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;
client.ClientCredentials.UserName.UserName = "admin";
client.ClientCredentials.UserName.Password = "*******";
object len = client.GetSingle("****");

有些朋友会想到把证书添加到"CURRENT_USER"存储区,调试时会通过,但在IIS会出现找不到证书的问题

Read more

超快速,使用ChatGPT编写回归和分类算法

超快速,使用ChatGPT编写回归和分类算法

本文将使用一些 ChatGPT 提示,这些提示对于数据科学家在工作时非常重要。 微信搜索关注《Python学研大本营》,加入读者群,分享更多精彩 以下是一些示例ChatGPT 提示的列表以及数据科学家的响应。 ChatGPT 提示 为决策树回归算法生成 python 代码。 下面是使用scikit-learn在 Python 中进行决策树回归的示例代码: import numpy as np import matplotlib.pyplot as plt from sklearn.tree import DecisionTreeRegressor # Generate random data rng = np.random.default_rng() x = 5 * rng.random(100) y = np.sin(x) + 0.

By Ne0inhk
力扣每日一题:993.二叉树的堂兄弟节点 深度优先算法

力扣每日一题:993.二叉树的堂兄弟节点 深度优先算法

993.二叉树的堂兄弟节点 难度:简单 题目: 在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。 如果二叉树的两个节点深度相同,但 父节点不同 ,则它们是一对堂兄弟节点。 我们给出了具有唯一值的二叉树的根节点 root ,以及树中两个不同节点的值 x 和 y 。 只有与值 x 和 y 对应的节点是堂兄弟节点时,才返回 true 。否则,返回 false。 示例: 示例 1: 输入:root = [1,2,3,4], x = 4, y = 3 输出:false

By Ne0inhk
1239.串联字符串的最大长度 关于字符串的回溯算法!

1239.串联字符串的最大长度 关于字符串的回溯算法!

题目: 给定一个字符串数组 arr,字符串 s 是将 arr 某一子序列字符串连接所得的字符串, 如果 s 中的每一个字符都只出现过一次,那么它就是一个可行解。 请返回所有可行解 s 中最长长度。 提示: 1 <= arr.length <= 16 1 <= arr[i].length <= 26 arr[i] 中只含有小写英文字母 示例: 示例 1: 输入:arr = ["un","iq","ue"] 输出:4 解释:所有可能的串联组合是

By Ne0inhk