1

在使用基于 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 是为我做的吗?

4

2 回答 2

3

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

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

我正在开发的应用程序需要基本身份验证。我们的服务器和客户端运行在一个(非常安全的)Intranet 中,因此我们不太关心使用 X.509 证书来加密通信的要求,如果您使用用户名身份验证,这是必需的。

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

一切都非常简单,无需更改客户端服务访问层或服务合同实现。由于这一切都是通过配置完成的,所以当我们需要迁移到更强大的东西时,迁移会很容易。

于 2008-08-30T21:56:23.107 回答
1

虽然我不想给出一个我不是 100% 确定的答案,但到目前为止缺乏回应让我认为在这种情况下一个可能正确的答案可能是可以的。

据我所知,WCF 并没有你正在寻找的那种开箱即用的会话令牌机制,这意味着你将不得不做一些繁重的工作才能让事情在你想要的方式。我应该明确指出,WCF 中有一个会话机制,但它专注于保证消息顺序,并不是创建身份验证会话的理想工具。

我刚刚完成了一个项目,在该项目中我们实现了自己的会话机制来处理各种遗留 SOAP 堆栈,但我相信实现认证会话的推荐方法是使用像Pablo Cibraro 的安全令牌服务 (STS) 。

如果您想了解更多详细信息,请大声疾呼,但我怀疑 Pablo 的博客将提供足够多的信息让您继续前进。

于 2008-08-29T08:24:36.853 回答