如何在WCF中使用客户端凭据进行一次身份验证?

时间:2008-08-27 18:23:21

标签: wcf security authentication ws-security

确保在使用基于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服务项目的一段时间内获取某种类型的令牌。我认为establishsecuritycontext = true为我做了这个吗?

2 个答案:

答案 0 :(得分:3)

如果您在Intranet上,则可以仅通过配置“免费”处理Windows身份验证。

如果这不合适,令牌服务工作正常,但在某些情况下,它们可能太多了。

我正在处理的应用程序需要进行简单的身份验证。我们的服务器和客户端在(非常安全的)内部网中运行,因此我们对使用X.509证书加密通信的要求并不太在意,如果您使用用户名身份验证,则需要这样做。

因此,我们向客户端添加了custom behavior,将用户名和(加密)密码添加到邮件头中,并在服务器上另一个自定义行为验证它们。

一切都非常简单,不需要对客户端服务访问层或服务契约实现进行任何更改。由于这一切都是通过配置来完成的,如果我们需要转移到更强一点的东西,那么迁移就很容易了。

答案 1 :(得分:1)

虽然我不愿意给出答案,但我并不是100%肯定,但到目前为止,由于缺乏回应,我认为在这种情况下可能是正确的答案。

据我所知,没有那种会话令牌机制,你正在寻找与WCF开箱即用的方式,这意味着你将不得不做一些繁重的工作来获取东西以你想要的方式工作。我应该明确说明WCF中有一个会话机制,但它专注于保证消息顺序,并不是创建认证会话的理想工具。

我刚刚完成了一个项目,我们实现了自己的会话机制来处理各种遗留SOAP堆栈,但我相信实现经过身份验证的会话的推荐方法是使用像{{3这样的安全令牌服务(STS) }}

如果你想了解更多细节,请大声喊叫,但我怀疑Pablo的博客会提供足够多的信息让你继续前进。