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

如何在WCF中仅使用一次客户端凭据进行身份验证?,wcf,security,authentication,ws-security,Wcf,Security,Authentication,Ws Security,使用基于WCF构建的API时,确保只需验证一次的最佳方法是什么 下面列出了我当前的绑定和行为 <bindings> <wsHttpBinding> <binding name="wsHttp"> <security mode="TransportWithMessageCredential"> <transport/>

使用基于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>

我想做的是使用这些凭据对API进行身份验证,然后在客户端应用程序使用web服务项目的时间段内获取某种类型的令牌。我认为这是为我做的?

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

据我所知,WCF没有现成的会话令牌机制,这意味着你必须做一些繁重的工作才能让事情以你想要的方式工作。我应该明确指出,WCF中有一个会话机制,但它的重点是保证消息顺序,而不是创建身份验证会话的理想工具

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


如果你想要更多的细节,请大声说出来,但我怀疑Pablo的博客将有足够多的信息供你继续前进。

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

据我所知,WCF没有现成的会话令牌机制,这意味着你必须做一些繁重的工作才能让事情以你想要的方式工作。我应该明确指出,WCF中有一个会话机制,但它的重点是保证消息顺序,而不是创建身份验证会话的理想工具

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


如果您想了解更多详细信息,请大喊一声,但我怀疑Pablo的博客将有足够多的信息供您使用。

如果您在内部网上,仅通过配置就可以“免费”处理Windows身份验证

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

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

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


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

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

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

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

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

所有这些都非常简单,不需要更改客户端服务访问层或服务契约实现。所有这些都是通过配置完成的,如果我们需要迁移到更强大的功能,那么迁移就很容易了

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()