如何只在WCF中使用客户端凭据进行一次身份验证?
确保使用WCF上构建的API仅需要进行一次身份验证的最佳方法是什么?
我当前的绑定和行为在下面列出
<bindings> <wsHttpBinding> <binding name="wsHttp"> <security mode="TransportWithMessageCredential"> <transport/> <message clientCredentialType="UserName" negotiateServiceCredential="false" establishSecurityContext="true"/> </security> </binding> </wsHttpBinding> </bindings> <behaviors> <serviceBehaviors> <behavior name="NorthwindBehavior"> <serviceMetadata httpGetEnabled="true"/> <serviceAuthorization principalPermissionMode="UseAspNetRoles"/> <serviceCredentials> <userNameAuthentication userNamePasswordValidationMode="MembershipProvider"/> </serviceCredentials> </behavior> </serviceBehaviors> </behaviors>
接下来是我在客户端应用程序中用于进行身份验证的内容(当前,每次我想打入WCF时都必须执行此操作)
Dim client As ProductServiceClient = New ProductServiceClient("wsHttpProductService") client.ClientCredentials.UserName.UserName = "foo" client.ClientCredentials.UserName.Password = "bar" Dim ProductList As List(Of Product) = client.GetProducts()
我想做的是使用这些凭据对API进行一次身份验证,然后在我的客户端应用程序使用Web服务项目的时间段内获取某种类型的令牌。我以为建立安全性上下文= true对我有用吗?
解决方案
回答
尽管我讨厌给出我不确定的答案,但到目前为止,由于缺乏答案,我认为在这种情况下,可能会给出正确的答案。
据我所知,我们没有使用WCF开箱即用的会话令牌机制,这意味着我们将需要做一些繁重的工作才能使事情在你想要的方式。我应该明确地说,WCF中有一个会话机制,但是它专注于保证消息顺序,而不是创建身份验证会话的理想工具。
我刚刚完成了一个项目,在该项目中我们实现了自己的会话机制来处理所有形式的旧SOAP堆栈,但是我认为实现身份验证会话的推荐方法是使用像Pablo Cibraro一样的安全令牌服务(STS)。
如果我们想了解更多详细信息,请大喊大叫,但我怀疑Pablo的博客中会有足够的信息供我们参考。
回答
如果我们在Intranet上,则仅通过配置即可免费获得Windows身份验证。
如果不合适,令牌服务就可以正常工作,但是在某些情况下它们可能太多了。
我正在处理的应用程序需要基本的身份验证。我们的服务器和客户端在(非常安全的)内部网中运行,因此我们不太在乎使用X.509证书加密通信的要求,如果我们使用用户名身份验证,这是必需的。
因此,我们向客户端添加了一个自定义行为,该用户行为将用户名和(加密的)密码添加到了邮件头中,并在服务器上验证了它们的另一个自定义行为。
一切都非常简单,不需要更改客户端服务访问层或者服务合同实现。而且,由于这一切都是通过配置完成的,因此,当我们需要迁移到更强大的功能时,将很容易进行迁移。