首页 > 解决方案 > 接收“JwtSecurityToken”不支持“SamlAssertionKeyIdentifierClause”创建。在 WCF 4.5 中使用已发行令牌创建通道时出错

问题描述

尝试使用“JwtSecurityToken”生成自定义 STS 令牌时,收到以下错误消息:

System.NotSupportedException:“JwtSecurityToken”不支持“SamlAssertionKeyIdentifierClause”创建。

我正在使用 .NET/WCF/WIF 4.5

JwtSecurityTokenHandler 来自

System.IdentityModel.Tokens.Jwt,版本=4.0.0.0,文化=中性,PublicKeyToken=31bf3856ad364e35

非常感谢任何帮助。

堆栈跟踪如下:

服务器堆栈跟踪:在 System.ServiceModel.Security.Tokens.SecurityTokenParameters.CreateKeyIdentifierClause[TExternalClause,TInternalClause](SecurityToken token, SecurityTokenReferenceStyle referenceStyle) 在 System.ServiceModel.Security.SendSecurityHeader.SignWithSupportingTokens() 的 System.IdentityModel.Tokens.SecurityToken.CreateKeyIdentifierClauseT在 System.ServiceModel.Security.SendSecurityHeader.CompleteSecurityApplication() 在 System.ServiceModel.Security.SecurityAppliedMessage.OnWriteMessage(XmlDictionaryWriter writer) 在 System.ServiceModel.Channels.BufferedMessageWriter.WriteMessage(Message message, BufferManager bufferManager, Int32 initialOffset, Int32 maxSizeQuota) 在System.ServiceModel.Channels.TextMessageEncoderFactory.TextMessageEncoder.WriteMessage(消息消息,Int32 maxMessageSize,System.ServiceModel.Channels.HttpOutput.SerializeBufferedMessage(Message message, Boolean shouldRecycleBuffer) 在 System.ServiceModel.Channels.HttpOutput.Send(TimeSpan timeout) 在 System.ServiceModel.Channels.HttpChannelFactory 的 BufferManager bufferManager, Int32 messageOffset)1.HttpRequestChannel.HttpChannelRequest.SendRequest(Message message, TimeSpan timeout) at System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout) at System.ServiceModel.Channels.SecurityChannelFactory1.SecurityRequestChannel.Request(Message message, TimeSpan timeout) at System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout) at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object [] ins, Object[] outs, TimeSpan timeout) at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation) at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

WS2007FederationHttpBinding ws2007FederationHttpBinding = CreateStsBinding();
        RequestSecurityToken request = new RequestSecurityToken
        {
            RequestType = RequestTypes.Issue,
            AppliesTo = new EndpointReference("appliestoURLGoeshere"),
            KeyType = KeyTypes.Symmetric,
            TokenType = "urn:ietf:params:oauth:token-type:jwt"
    };

        EndpointIdentity rpIdentity = new X509CertificateEndpointIdentity(new X509Certificate2(Convert.FromBase64String("base64CertificateValues")));
        WSTrustChannelFactory factory = new WSTrustChannelFactory(ws2007FederationHttpBinding, new EndpointAddress(new Uri("endpointUri"), rpIdentity))
        {
            TrustVersion = TrustVersion.WSTrust13
        };
        factory.Credentials.SupportInteractive = false;
        factory.Credentials.UseIdentityConfiguration = true;
        factory.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;
        factory.Credentials.ServiceCertificate.Authentication.RevocationMode = X509RevocationMode.NoCheck;
        IWSTrustChannelContract channel = factory.CreateChannelWithIssuedToken(myJwtIssuedToken);       
         //...............Receive error here............
         SecurityToken securityToken = channel.Issue(request);
        return securityToken;

标签: c#wcfjwtwifws-federation

解决方案


推荐阅读