gpt4 book ai didi

.net - UserNamePasswordValidator 和证书

转载 作者:可可西里 更新时间:2023-11-01 02:41:48 26 4
gpt4 key购买 nike

我有一个使用 net tcp 绑定(bind)和自定义 UserNamePasswordValidator 的 Web 服务。用户名和密码由客户端在 Credentials.UserName.UserName 和 Credentials.UserName.Password 中发送。我的服务主机设置如下:

host.Credentials.UserNameAuthentication.UserNamePasswordValidationMode = UserNamePasswordValidationMode.Custom;             host.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = myCustomValidator;
host.Authorization.PrincipalPermissionMode = PrincipalPermissionMode.Custom;

如果绑定(bind)的 SecurityMode=TransportWithMessageCredential 和 ClientCredentialType=MessageCredentialType.UserName 被使用但它需要一个证书,它会完美地工作。

我想让它在没有证书的情况下工作。如果我将绑定(bind)的 SecurityMode 更改为 None,服务将启动,但我的 UserNamePasswordValidator 类从未被调用。

我尝试了 SecurityMode=Message 和 SecurityMode.Transport,在这两种情况下,服务都需要证书才能启动。

我错过了什么吗?自定义用户名和密码验证器是否总是需要证书?

最佳答案

不幸的是,WCF 不允许您通过网络以纯文本形式发送用户名/密码。你仍然可以做到,但它需要你像这个人那样创建一个自定义绑定(bind) here .这意味着您将必须使用证书进行加密。请注意,这与证书身份验证不同,因此请不要在这方面感到困惑。这意味着您必须安装公开公钥的证书。所以您的服务器配置将如下所示:

    <bindings>
<wsHttpBinding>
<binding name="CustomAuthentication">
<security mode="Message">
<message clientCredentialType="UserName" />
</security>
</binding>
</wsHttpBinding>
</bindings>

...

<serviceBehaviors>
<behavior name="CustomPasswordAuthentication">
<serviceMetadata httpGetEnabled="true" httpGetUrl="" />
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceCredentials>
<serviceCertificate findValue="MyCertificateName" x509FindType="FindBySubjectName" storeLocation="LocalMachine" storeName="Root" />
<userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="MyCompany.WebServices.CustomUsernamePasswordValidator, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</serviceCredentials>
</behavior>
</serviceBehaviors>

客户端:

client.ClientCredentials.UserName.UserName = "hello";
client.ClientCredentials.UserName.Password = "hello";
client.ClientCredentials.ServiceCertificate.Authentication.RevocationMode = X509RevocationMode.NoCheck;
client.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.PeerOrChainTrust;
client.Open();

希望这对您有所帮助。编辑:只需将 wsHttpBinding 更改为 TCP 或您正在使用的任何内容。

关于.net - UserNamePasswordValidator 和证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5555512/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com