gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:25:38 27 4
gpt4 key购买 nike

我将 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com