在开发Windows Communication Foundation (WCF) 服务时,经常需要自定义用户验证机制。大多数示例都是使用自托管应用程序编写的,并且按照设计工作。然而,当需要在启用了基本认证的IIS托管站点上实现相同的方法时,就出现了问题。如果已经为非Windows凭据实现了自定义用户名密码验证器,并且配置了以下设置:
HTML代码:
<basicHttpBinding>
<binding name="basicHttp" closeTimeout="00:01:00" openTimeout="00:01:00" />
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Basic" proxyCredentialType="None" realm="" />
</security>
</basicHttpBinding>
可能遇到了这个错误:
The HTTP request is unauthorized with client authentication scheme 'Basic'.
The authentication header received from the server was 'Negotiate,NTLM,Basic realm="localhost"'
这个错误表明请求中提供的凭据对于这个域(localhost)无效。IIS期望得到一个它能够在本地机器或域中找到的用户。如果提供了一个存在的本地或活动目录凭据,错误将不再出现。然而,可能并不想为自定义认证添加Windows帐户。此外,即使使用了一个本地帐户,可能会注意到自定义验证器的Validate方法从未被调用。这是预期的,因为IIS已经完成了验证。
要在IIS上使其工作,可以尝试以下设置:
HTML代码:
<basicHttpBinding>
<binding name="basicHttp" closeTimeout="00:01:00" openTimeout="00:01:00" />
<security mode="TransportWithMessageCredential">
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</basicHttpBinding>
正在更改安全模式,使用传输与消息凭据,它期望一个消息凭据类型。设置了凭据类型为UserName。然而,此设置要求在本地IIS上安装一个证书,并使用HTTPS而不是HTTP,因此请确保在客户端和服务器配置文件中更改端点地址以使用HTTPS。对于开发环境,自签名证书就足够了。
希望这篇简短的文章能够帮助解决在IIS托管的WCF服务中实现自定义用户名密码验证器的问题。
以下是实现自定义用户名密码验证器的详细步骤:
步骤1:创建自定义用户名密码验证器类。
public class CustomUserNamePasswordValidator : UserNamePasswordValidator
{
public override void Validate(string userName, string password)
{
// 实现自定义验证逻辑
}
}
步骤2:在Web.config中配置自定义验证器。
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceCredentials>
<userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="YourNamespace.CustomUserNamePasswordValidator, YourAssembly" />
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
步骤3:配置基本HTTP绑定。
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="basicHttp" closeTimeout="00:01:00" openTimeout="00:01:00">
<security mode="TransportWithMessageCredential">
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
</system.serviceModel>
步骤4:配置服务端点。
<system.serviceModel>
<services>
<service name="YourNamespace.YourService">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicHttp" contract="YourNamespace.IYourService" />
</service>
</services>
</system.serviceModel>
步骤5:确保在客户端和服务器配置文件中更改端点地址以使用HTTPS。
步骤6:在IIS上安装自签名证书。
通过以上步骤,应该能够在IIS托管的WCF服务中实现自定义用户名密码验证器,并解决基本认证问题。
1. 如何在IIS上安装自签名证书?
在IIS管理器中,选择服务器证书,然后创建自签名证书。
2. 如何配置HTTPS?
在IIS管理器中,选择网站,然后绑定HTTPS。
3. 如何确保自定义验证器被调用?
确保在Web.config中正确配置了自定义验证器。
4. 如何处理HTTPS连接问题?
确保客户端信任服务器的证书。
5. 如何调试自定义验证器?