如何在 WCF 中使用客户端凭据进行一次身份验证?
-
09-06-2019 - |
题
确保在使用基于 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 为我做了这个吗?
解决方案
如果您位于 Intranet 上,则只需通过配置即可“免费”处理 Windows 身份验证。
如果这不合适,令牌服务可以正常工作,但在某些情况下它们可能太多了。
我正在开发的应用程序需要简单的身份验证。我们的服务器和客户端在(非常安全的)Intranet 内运行,因此我们不太关心使用 X.509 证书来加密通信的要求,如果您使用用户名身份验证,则需要使用 X.509 证书来加密通信。
所以我们添加了一个 自定义行为 客户端将用户名和(加密的)密码添加到消息标头,以及服务器上验证它们的另一个自定义行为。
一切都非常简单,无需更改客户端服务访问层或服务契约实现。由于这一切都是通过配置完成的,因此如果我们需要迁移到更强大的东西,迁移就会很容易。
其他提示
虽然我不想给出一个我不能 100% 确定的答案,但到目前为止缺乏回应让我认为在这种情况下可能是正确的答案。
据我所知,WCF 并没有您正在寻找的那种开箱即用的会话令牌机制,这意味着您将不得不做一些繁重的工作才能让事情在 WCF 中正常运行。你想要的方式。我应该明确指出,WCF 中有一个会话机制,但它的重点是保证消息顺序,并不是创建身份验证会话的理想工具。
我刚刚完成一个项目,在该项目中我们实现了自己的会话机制来处理各种遗留 SOAP 堆栈,但我相信实现经过身份验证的会话的推荐方法是使用安全令牌服务 (STS),例如 巴勃罗·西布拉罗.
如果您想了解更多详细信息,请大声喊叫,但我怀疑巴勃罗的博客将提供足够的信息供您继续前进。