2008-08-27 116 views
1

在使用基于WCF构建的API时,确保只需要验证一次的最佳方法是什么?如何在WCF中使用客户端凭据进行身份验证?

我现在的绑定和行为列举如下

<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为我做了这个?

回答

3

如果您使用的是Intranet,则可以通过配置单独处理“免费”Windows身份验证。

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

我正在使用的应用程序需要裸机身份验证。我们的服务器和客户端在一个(非常安全的)内部网络中运行,所以我们并不太在乎使用X.509证书来加密通信的要求,如果您使用用户名认证,则需要这种证书。

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

所有非常简单,不需要对客户端服务访问层或服务合同实现进行更改。而且这一切都是通过配置完成的,如果我们需要移动到更强一点的位置,移植起来会很容易。

1

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

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

我刚刚完成的,我们实现了自己的会议机制,以处理遗留的SOAP堆栈的所有方式的一个项目工作,但我相信,以实现身份验证会话的推荐方法是使用一个安全令牌服务(STS),如Pablo Cibraro's

如果您想了解更多详情,请留言,但我怀疑巴勃罗的博客将有足够的信息让您前进。

相关问题