ASP.Net 5 - OAuth承载令牌(JWT)验证错误

时间:2015-07-14 04:00:21

标签: c# asp.net asp.net-core

我一直致力于使用JSON Web令牌在我的网站上对用户进行身份验证和授权的系统。我的系统刚刚完成,但当我尝试在我的代码中使用[Authorize(" Bearer")]属性时,我遇到了错误。错误如下:

  

发生System.IdentityModel.Tokens.SecurityTokenInvalidSignatureException   消息:抛出异常:' System.IdentityModel.Tokens.SecurityTokenInvalidSignatureException'在Microsoft.IdentityModel.Logging.dll中   其他信息:IDX10503:签名验证失败。钥匙尝试了:''。   遇到例外情况:    '&#39 ;.   令牌:' {"典型":" JWT"," alg":" RS256","孩子&#34 ;日期null} {"&填充NameID#34;:" 6581f5a0-1775-4ce4-8650-a3d7e613b216"" UNIQUE_NAME":"阿莱克斯&#34 ;, " AspNet.Identity.SecurityStamp":" 8da933c3-0f88-42ea-876d-c07e99d1eecc"" ISS":" Uniti的"&# 34; AUD":" Uniti的""&EXP#34;:1436849284," NBF":1436845684}'

我不明白它为什么不用JWT测试任何键。我的启动文件中定义了RSA密钥。在没有进一步拖动的情况下,我提供了下面解决此错误所需的代码。

我的启动代码(生成密钥和OAuthBearer选项):

#region RSA Key Generation

        var rsa = new RSACryptoServiceProvider(2048);
        var rsaKey = rsa.ExportParameters(true);
        var key = new RsaSecurityKey(rsaKey);

        services.AddInstance(new SigningCredentials(key, SecurityAlgorithms.RsaSha256Signature, SecurityAlgorithms.Sha256Digest));

        #endregion

        services.AddInstance(new OAuthBearerAuthenticationOptions
        {
            SecurityTokenValidators = new List<ISecurityTokenValidator>
            {
                new JwtSecurityTokenHandler()
            },
            TokenValidationParameters = new TokenValidationParameters
            {
                IssuerSigningKey = key,
                ValidIssuer = "Uniti",
                ValidAudience = "Uniti"
            },
        });

        services.AddAuthorization();
        services.ConfigureAuthorization(auth =>
        {
            auth.AddPolicy("Bearer", builder =>
            {
                builder.AddAuthenticationSchemes(OAuthBearerAuthenticationDefaults.AuthenticationScheme);
                builder.RequireAuthenticatedUser();
            });
        });

我的令牌生成代码:

var claimsIdentity = (ClaimsIdentity) User.Identity;

            var handler = BearerOptions.SecurityTokenValidators.OfType<JwtSecurityTokenHandler>().First();
            var securityToken = handler.CreateToken(
                issuer: "Uniti",
                audience: "Uniti",
                signingCredentials: BearerCredentials,
                subject: claimsIdentity
                );

            var token = handler.WriteToken(securityToken);

我忘记在某处添加某些内容,或者我是否错误地生成了密钥?如果你能帮助我,请提前感谢!

1 个答案:

答案 0 :(得分:2)

我敢打赌,由于注册OAuth2承载选项的不正确方式,正如我之前的回答中所述:https://stackoverflow.com/a/31322654/542757

services.AddInstance(new OAuthBearerAuthenticationOptions());

当您使用services.AddInstance时,OAuth2承载中间件无法检索选项(因此也就是密钥),因为它内部使用IOptions<OAuthBearerAuthenticationOptions>而不是OAuthBearerAuthenticationOptions

这是注册OAuth2承载选项的正确方式:

services.ConfigureOAuthBearerAuthentication(options => {
    // Configure the options used by the OAuth2 bearer middleware.
});
相关问题