确保在使用基于 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),例如 巴勃罗·西布拉罗.

如果您想了解更多详细信息,请大声喊叫,但我怀疑巴勃罗的博客将提供足够的信息供您继续前进。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top