JwtSecurityTokenHandler()。ValidateToken()::签名验证失败...在此上下文中不支持sha256

时间:2013-07-16 17:51:02

标签: c# wif jwt x509securitytokenmanager

执行JwtSecurityTokenHandler()时出现以下错误:ValidateToken()函数:

这是我的伪代码:

var jwtToken = {...}
var tokenHandler = new JwtSecurityTokenHandler();
var validationParameters = new TokenValidationParameters {...};
var claimsPrincipal = tokenHandler.ValidateToken(jwtToken, validationParameters);

这是错误:

Jwt10316: Signature validation failed. Keys tried: 'System.IdentityModel.Tokens.X509AsymmetricSecurityKey'.
Exceptions caught:
 'System.InvalidOperationException: Jwt10518: AsymmetricSecurityKey.GetHashAlgorithmForSignature( 'http://www.w3.org/2001/04/xmldsig-more#hmac-sha256' ) threw an exception.
AsymmetricSecurityKey: 'System.IdentityModel.Tokens.X509AsymmetricSecurityKey'
SignatureAlgorithm: 'http://www.w3.org/2001/04/xmldsig-more#hmac-sha256', check to make sure the SignatureAlgorithm is supported.
Exception: 'System.NotSupportedException: Crypto algorithm 'http://www.w3.org/2001/04/xmldsig-more#hmac-sha256' not supported in this context.
   at System.IdentityModel.Tokens.X509AsymmetricSecurityKey.GetHashAlgorithmForSignature(String algorithm)
   at System.IdentityModel.Tokens.AsymmetricSignatureProvider..ctor(AsymmetricSecurityKey key, String algorithm, Boolean willCreateSignatures)'. 
---> System.NotSupportedException: Crypto algorithm 'http://www.w3.org/2001/04/xmldsig-more#hmac-sha256' not supported in this context.
   at System.IdentityModel.Tokens.X509AsymmetricSecurityKey.GetHashAlgorithmForSignature(String algorithm)
   at System.IdentityModel.Tokens.AsymmetricSignatureProvider..ctor(AsymmetricSecurityKey key, String algorithm, Boolean willCreateSignatures)
   --- End of inner exception stack trace ---
   at System.IdentityModel.Tokens.AsymmetricSignatureProvider..ctor(AsymmetricSecurityKey key, String algorithm, Boolean willCreateSignatures)
   at System.IdentityModel.Tokens.SignatureProviderFactory.CreateProvider(SecurityKey key, String algorithm, Boolean willCreateSignatures)
   at System.IdentityModel.Tokens.SignatureProviderFactory.CreateForVerifying(SecurityKey key, String algorithm)
   at System.IdentityModel.Tokens.JwtSecurityTokenHandler.ValidateSignature(SecurityKey key, String algorithm, Byte[] encodedBytes, Byte[] signature)
   at System.IdentityModel.Tokens.JwtSecurityTokenHandler.ValidateSignature(JwtSecurityToken jwt, Byte[] signatureBytes, IEnumerable`1 signingTokens)'.

System.NotSupportedException:加密算法“http://www.w3.org/2001/04/xmldsig-more#hmac-sha256

奇怪的是,错误消息的这一部分之外的是编码到令牌中的声明。作为解决方法,我正在进行一些文本解析并重新构建我的ClaimsPrincipal,但我不应该这样做。

有关如何为此上下文启用sha256的任何想法吗?

更新:由于我没有在这个问题上采取任何行动(除了获得风滚草徽章)我将添加更多细节也许有人可以帮助我解决问题的来源。我必须假设,因为没有其他人遇到这个问题,我必须在某处出现用户错误。如果听起来不对劲,请告诉我。

我的猜测是,由于我们未通过jwt验证,因此它可能与验证机器/ idP上的证书有关。

  1. 我为idP创建了sha256签名证书,并将其放入idP的个人证书中。
  2. 我导出了该证书的公钥,并将其放入我的验证机器的受信任人员的Cert文件夹中。
  3. 然后我从我的idP收到一个令牌后,在我的验证机器上运行以下代码:
  4. 示例:

    var jwtToken = response.AccessToken;
    var store = new X509Store(StoreName.TrustedPeople, StoreLocation.LocalMachine);
    store.Open(OpenFlags.ReadOnly);
    X509Certificate2 cert = store.Certificates.Find(X509FindType.FindByThumbprint, "thinktecture identityserver 2.Configuration => Key Configuration => Signing Thumbprint>", false)[0];
    store.Close();
    var tokenHandler = new JwtSecurityTokenHandler();
    var validationParameters = new TokenValidationParameters
                    {
                        AllowedAudience = "<thinktecture identityserver 2.Configuration => Relying Party => Realm/Scope Name>",
                        ValidIssuer = "<thinktecture identityserver 2.Configuration => General Configuration => Site ID>",
                        SigningToken = new X509SecurityToken(cert)
                    };
    
    ClaimsPrincipal claimsPrincipal = tokenHandler.ValidateToken(jwtToken, validationParameters);
    

    请注意我使用以下占位符来显示数据的填充位置:

    • thinktecture identityserver 2.Configuration =&gt;密钥配置=&gt;签署指纹
    • thinktecture identityserver 2.Configuration =&gt;依赖方=&gt;领域/范围名称
    • thinktecture identityserver 2.Configuration =&gt;一般配置=&gt;网站ID

    在这种情况下,你有什么可以看到我做错了吗?

    更新2

    我遇到了这段代码:http://pastebin.com/DvQz8vdb并且通过它运行我的JWT之后我给了我同样的错误:基本上它说它只支持“RS256”,“HS384”或“HS512”。也许这是我的问题..我的JWT回来了HS256,而不是RS256或HS&gt; 256(384/512)

    如何将签名算法从HS256更改为HS512?

    此时我认为我们又回到了身份服务器问题?

3 个答案:

答案 0 :(得分:2)

巧合地进入这个老帖子,但是近一年前我遇到了类似的问题,我会从当时提到我的发现。基本上是通往&#34; force&#34;使用签名证书的IdSrv V2是为了确保没有为依赖方定义的对称签名密钥。只要定义它,它将始终使用对称签名密钥。有关详细信息,请参阅我的blog post

希望这可以帮助其他人在这里结束: - )

答案 1 :(得分:1)

我终于可以把它关闭了。看来签名证书实际上与IdentityServer下的oAuth2协议中的jwt无关。无论我使用什么证书,我都收到了错误。

我已使用对称签名密钥验证jwt,而不是在IdentityServer的“密钥配置”部分下找到的签名证书,解决了该问题。

答案 2 :(得分:0)

我知道这是一个老问题,但我遇到了完全相同的问题,但在CrptoHelper.GetIdentityFromConfig中发现了一个connect issue与竞争条件有关的问题