问题描述
我有一个托管在IIS中的WCF服务。关于服务,我在服务中有大约20种方法。我想用用户名/密码保护其中的一些方法。我无法控制正在调用该服务的客户端,因此我无法在客户端上安装证书。我们的服务充当一个平台,保存所有用户配置文件信息,包括登录信息。
我认为我希望客户端对WCF服务上的身份验证(用户名、密码)方法进行一次身份验证,获得一个授权令牌,并将该令牌传递给后续调用。(有点像ASP.NET成员提供程序使用表单身份验证会话)。如果可能的话,我不希望客户端必须为每个方法调用传递用户名/密码。这是正确的图案吗?有没有更好的方法让这个功能使用标准的WCF功能工作?有没有人有任何示例配置/代码来显示正确的工作方式?
wcf
推荐答案不提供开箱即用的每操作身份验证。如果您想要安全和不安全的操作,最简单的方法是将它们划分为两个服务合同,并用不同的安全设置公开每个合同。
您的授权令牌概念已在WCF中实现,但在您的方案中,您必须使用wsHttpBinding、用户名客户端凭据、SecurityContext和服务证书。
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="securedService">
<serviceCredentials>
<serviceCertificate x509FindType="FindBySubjectName" findValue="ServerCert"
storeLocation="LocalMachine" storeName="My"/>
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<wsHttpBinding>
<binding name="Secured">
<security mode="Message">
<message clientCredentialType="UserName" establishSecurityContext="true" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<services>
<service name="MessageSecurity.Service" behaviorConfiguration="securedService">
<endpoint address="" binding="wsHttpBinding" bindingConfiguration="Secured"
contract="MessageSecurity.IService">
</endpoint>
</service>
</services>
</system.serviceModel>
SecurityContext是基于WS-SecureConversation的互操作功能。它只需要在第一次从服务代理实例调用时传递用户名和密码(在WCF中,这是完全透明的--客户端代理实例维护安全上下文)。后续呼叫仅使用在第一次呼叫期间颁发的安全令牌。默认情况下,在wsHttpBinding中打开SecurityContext。
此配置还将对消息进行加密和签名-它是完全强大的WS-Security。其他任何方法都由你自己决定。你们必须完全靠自己来实现它。
您提到您无法控制客户端。这并不意味着你不能使用证书。如果您使用证书,如果客户想要调用您的服务,则有责任获得证书。它与对客户端的控制无关,它与对证书的信任有关-对于公共Web服务,它意味着从受信任的证书颁发机构购买证书。
此外,无需安装即可获得服务证书。第一种可能性是使用证书作为端点身份。在这种情况下,编码证书是wsdl的一部分:<wsdl:service name="Service">
<wsdl:port name="WSHttpBinding_IService" binding="tns:WSHttpBinding_IService">
<soap12:address location="http://localhost:1432/Service.svc" />
<wsa10:EndpointReference>
<wsa10:Address>http://localhost:1432/Service.svc</wsa10:Address>
<Identity xmlns="http://schemas.xmlsoap.org/ws/2006/02/addressingidentity">
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<X509Data>
<X509Certificate>MIICmzCCAYegAwI....<X509Certificate>
</X509Data>
</KeyInfo>
</Identity>
</wsa10:EndpointReference>
</wsdl:port>
</wsdl:service>
如果您指定wsHttpBinding终结点时配置了服务证书,并且没有设置其身份,则会自动执行此操作。这种方法的缺点是证书过期。如果更改过期证书,则必须更新所有客户端。
第二种可能是启用服务凭据协商:
<bindings>
<wsHttpBinding>
<binding name="Secured">
<security mode="Message">
<message clientCredentialType="UserName" negotiateServiceCredential="true"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
默认情况下,协商处于打开状态。它使用TLSNego协议在安全通信开始之前交换服务凭据(证书)。这种方法的缺点是并不是所有平台都支持TLSNego。
这篇关于没有客户端证书的WCF消息/方法安全性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!