代码之家  ›  专栏  ›  技术社区  ›  Toran Billups

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

  •  1
  • Toran Billups  · 技术社区  · 17 年前

    在使用基于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 回复  |  直到 8 年前
        1
  •  3
  •   Jeremy McGee    17 年前

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

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

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

    所以我们添加了一个 custom behavior 将用户名和(加密的)密码添加到消息头的客户端,以及验证它们的服务器上的另一个自定义行为。

    所有这些都非常简单,不需要对客户端服务访问层或服务契约实现进行更改。由于这一切都是通过配置完成的,如果我们需要迁移到更强大的东西,迁移将很容易。

        2
  •  1
  •   Ubiguchi    17 年前

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

    据我所知,WCF没有那种开箱即用的会话令牌机制,这意味着你必须做一些繁重的工作才能让事情按你想要的方式运行。我应该明确一点,WCF中有一个会话机制,但它侧重于保证消息顺序,不是创建身份验证会话的理想工具。

    我刚刚完成了一个项目,在这个项目中,我们实现了自己的会话机制来处理各种遗留的SOAP栈,但我认为实现身份验证会话的推荐方法是使用安全令牌服务(STS),如 Pablo Cibraro's .

    如果你想了解更多细节,请大声说出来,但我怀疑巴勃罗的博客会有足够多的信息让你继续前进。