为什么wcf不允许在没有http模块的情况下,通过传输安全模式进行用户名/密码认证
本文关键字:安全模式 传输 用户 认证 密码 不允许 wcf http 情况下 模块 为什么 | 更新日期: 2023-09-27 18:15:53
我想使用用户名/密码身份验证和ssl的传输安全模式,它与windows身份验证工作良好:
<transport clientCredentialType="Windows"/>
我在msdn上找到了一篇文章,解释了如何使用传输安全模式进行用户名/密码认证,但需要自定义http模块。我很感兴趣为什么没有默认的安全模式,如:
<transport clientCredentialType="Username"/>
如果我需要用户名/密码认证,我可以使用消息安全模式,但如果所有站点使用https/ssl进行认证,那么在wcf中这样做应该不会有问题。
这个问题问错了。WCF允许使用自定义用户名/密码验证的传输安全性。传输安全模式对给定的传输协议使用标准化的身份验证模式,而HTTP没有任何标准化的"UserName"身份验证模式。它具有等效的模式,称为基本身份验证:
<security mode="Transport">
<transport clientCredentialType="Basic" />
</security>
默认情况下,Basic
认证需要Windows帐户,但您可以切换自定义UserNamePasswordValidator
验证。问题是,这只适用于自托管服务。它在IIS中托管服务时不起作用。这就是为什么这个问题问错了。问题不在WCF,而在IIS。
当您在IIS中托管服务时,它负责身份验证和身份验证。IIS中基本身份验证的默认模块仅支持Windows帐户。这就是为什么你需要自定义模块来使用非windows帐户的原因。
正如@Marc在评论中提到的,你也可以使用TransportWithMessageCredential
安全模式:
<security mode="TransportWithMessageCredential">
<message clientCredentialType="UserName" />
</security>
在此场景中,不对传输协议执行身份验证。它是消息的一部分(它使用WS-Security的UserNameToken配置文件标准)。您可以再次使用自定义UserNamePasswordValidator
,这次它适用于自托管和IIS托管的SOAP服务(SOAP是强制性要求)。