wcf - 可以使用带有用户名/密码和客户端证书的 WCF STS 吗?

标签 wcf authentication certificate wif

我将 WIF 与 STS 结合使用。一切正常,客户端通过在凭据中发送用户名/密码进行身份验证。

我们在客户现场安装客户端。 我希望每个客户都为其客户使用自己的证书。原因是没有可能的“客户站点”验证。我可以停用一些用户帐户,但我不能一次禁用客户安装的所有客户端。
如果每个客户都有不同的证书,我可以撤销该证书,并且该客户的任何客户端都无法再连接。

我找不到任何方法来强制客户端将其证书设置为通信。通常,当身份验证模式设置为 certificate 时,这是自动的,但我需要将其设置为 windows 才能发送身份验证。

有人知道如何实现吗?或者让我知道这是否不可能。

干杯。

最佳答案

当然,您只需要做一些步法就可以开始使用自定义安全绑定(bind)扩展元素来描述 token 以及应该使用哪个 token 进行签名/背书。出于解释的目的,我假设您总是希望同时传递证书和用户名/密码。

在自定义绑定(bind)元素中,您需要创建一个 TransportSecurityBindingElement并向其添加 token 参数。可以向三个集合添加 token 参数:SignedEncryptedSignedEndorsing。对于我们在这里讨论的场景,我建议添加 UserNameSecurityTokenParametersSignedEncrypted 集合和 X509SSecurityTokenParametersEndorsing 集合。这意味着消息有效性/完整性由证书 token 而不是用户名/密码提供,并且用户名/密码 token 将由证书 token 签名加密。这将类似于以下内容:

public class MySecurityBindingElement : BindingElementExtensionElement
{
    public override void ApplyConfiguration(BindingElement bindingElement)
    {
        base.ApplyConfiguration(bindingElement);

        TransportSecurityBindingElement transportSecurityBindingElement = (TransportSecurityBindingElement)bindingElement;

        transportSecurityBindingElement.EndpointSupportingTokenParameters.SignedEncrypted.Add(new UserNameSecurityTokenParameters());

        transportSecurityBindingElement.EndpointSupportingTokenParameters.Endorsing.Add(new X509SecurityTokenParameters
        {
            InclusionMode = SecurityTokenInclusionMode.AlwaysToRecipient,
            ReferenceStyle = SecurityTokenReferenceStyle.Internal,
            RequireDerivedKeys = false,
            X509ReferenceStyle = X509KeyIdentifierClauseType.Any
        });         
    }

    protected override BindingElement CreateBindingElement()
    {
        TransportSecurityBindingElement result = new TransportSecurityBindingElement
        {
            IncludeTimestamp = true,
            LocalClientSettings.DetectReplays = false,
            LocalServiceSettings.DetectReplays = false
        };

        this.ApplyConfiguration(result);

        return result;
     }
}

然后,从客户端的角度来看,您只需确保为用于与服务器通信的每个 channel 设置证书和用户名密码。您可以在运行时通过设置 the Credentials property 上的属性来执行此操作ChannelFactory 或标准 WCF,ClientBase proxy类(class)。您可以做的另一件事是通过端点行为设置客户端证书,如下所示:

<endpointBehavior>
    <behavior name="MyBehavior">
        <clientCredentials>
            <clientCertificate findValue="MySubject" x509FindType="FindBySubjectName" storeLocation="LocalMachine" storeName="My" />
        </clientCredentials>
    </behavior>
</endpointBehavior>

通过这种方式,您只需要在运行时显式设置用户名/密码。

最后,在 STS 中,您可以通过 OperationContext::SupportingTokens 读取用户指定的 token 。属性(property)。你会发现 UserNameSecurityToken 的实例和 X509SecurityToken在集合中,您可以从那里使用它们来验证调用者。

关于wcf - 可以使用带有用户名/密码和客户端证书的 WCF STS 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6111754/

相关文章:

java - Android 应用 : best practices 的 Facebook 登录

apache - Let's Encrypt证书: https://www. website.com的问题不适用于重定向到https ://website. com

c# - 在 WCF Rest 服务中处理 404

wcf - 是否必须手动将证书添加到客户端计算机?

c# - 通过 WCF 更新应用程序

authentication - Keycloak 登录页面显示 'invalid parameter: redirect_uri'

ios - SWIFT:填写 HTML 输入 [类型 =“text”]

code-signing - signtool吊销问题?

Glassfish 3.1.2 配置相互认证的客户端证书

wcf - WCF 服务可以有多少个 ServiceContract?