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

本文关键字:JWT 验证 错误 令牌 Net oth ASP | 更新日期: 2023-09-27 18:02:27

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

System.IdentityModel.Tokens。SecurityTokenInvalidSignatureException发生消息:抛出异常:'System.IdentityModel.Tokens. '。Microsoft.IdentityModel.Logging.dll中的SecurityTokenInvalidSignatureException'附加信息:IDX10503:签名验证失败。Keys试了试:"。捕获异常:"。令牌:"{"typ":"JWT"、"alg":"RS256"、"孩子":零},{"nameid":"6581 f5a0 - 1775 - 4 - ce4 - 8650 a3d7e613b216"、"unique_name":"亚历克斯","AspNet.Identity.SecurityStamp":"8 da933c3 - 0 - f88 - 42 - ea - 876 d - c07e99d1eecc"、"国际空间站":"Uniti"、"澳大利亚":"Uniti"、"经验值":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);

是我忘记在某处添加一些东西,还是我错误地生成密钥?如果你能帮助我,提前感谢!

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

我打赌这是由于不正确的注册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.
});