WCF服务的自定义用户名密码验证器

在开发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. 如何调试自定义验证器?

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485