You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CoreWCF自定义绑定报错:无法创建BearerKey类型密钥元素求解决

问题原因与解决方案

错误根源

你遇到的错误是因为WS2007FederationHttpBinding默认使用的MessageSecurityVersion对应较旧的WS-Security规范(如WSSecurity11、WSTrustFebruary2005),这些规范不支持BearerKey类型的密钥。Bearer密钥支持是在后续的WS-Security版本(如WSSecurity13、WSTrust13)中引入的。

解决方案

最直接的修复方式是将自定义绑定的基类从WS2007FederationHttpBinding切换为WS2012FederationHttpBinding,该绑定默认使用支持BearerKey的MessageSecurityVersion。

修改后的自定义绑定代码如下:

public class CustomFederatedBufferedBinding : WS2012FederationHttpBinding
{
    public CustomFederatedBufferedBinding(WSFederationHttpSecurityMode mode) : base(mode)
    {
        Security.Message.EstablishSecurityContext = false;
        Security.Message.IssuedKeyType = CoreWCF.IdentityModel.Tokens.SecurityKeyType.BearerKey;
        Security.Message.NegotiateServiceCredential = true;
        Security.Message.AlgorithmSuite = SecurityAlgorithmSuite.Default;
        CloseTimeout = new TimeSpan(0, 0, 0, BindingHelper.JWTCloseTimeout, 0);
        SendTimeout = new TimeSpan(0, 0, 0, BindingHelper.JWTSendTimeout, 0);
        ReceiveTimeout = new TimeSpan(0, 0, 0, BindingHelper.JWTReceiveTimeout, 0);
        Name = "federated";
    }

    protected override TransportBindingElement GetTransport()
    {
        var httpBinding = new HttpsTransportBindingElement()
        {
            MaxBufferPoolSize = BindingHelper.JWTMaxBufferPoolSize,
            MaxReceivedMessageSize = BindingHelper.JWTMaxReceivedMessageSize,
        };
        return httpBinding;
    }

    protected override SecurityBindingElement CreateMessageSecurity()
    {
        var sec = base.CreateMessageSecurity();
        sec.LocalServiceSettings.MaxClockSkew = TimeSpan.FromHours(24);
        return sec;
    }
}

备选方案(如需保留WS2007绑定)

如果你必须继续使用WS2007FederationHttpBinding,可以手动修改SecurityBindingElement的MessageSecurityVersion为支持BearerKey的版本:

protected override SecurityBindingElement CreateMessageSecurity()
{
    var sec = base.CreateMessageSecurity();
    // 设置支持BearerKey的安全版本
    sec.MessageSecurityVersion = MessageSecurityVersion.WSSecurity13WSTrust13WSSecureConversation13WSSecurityPolicy12BasicSecurityProfile10;
    sec.LocalServiceSettings.MaxClockSkew = TimeSpan.FromHours(24);
    return sec;
}

注意:此方式可能存在兼容性问题,因为WS2007绑定的其他组件是基于旧规范设计的,优先推荐使用WS2012绑定方案。

内容的提问来源于stack exchange,提问作者Parvez Siddique

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 13:08:10