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

时间:2020-03-05 18:44:00  来源:igfitidea点击:

确保使用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证书加密通信的要求,如果我们使用用户名身份验证,这是必需的。

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

一切都非常简单,不需要更改客户端服务访问层或者服务合同实现。而且,由于这一切都是通过配置完成的,因此,当我们需要迁移到更强大的功能时,将很容易进行迁移。