【问题标题】:Resolve Authentication problem JWT Bearer for .NET Core API解决 .NET Core API 的身份验证问题 JWT Bearer
【发布时间】:2021-04-15 20:12:10
【问题描述】:

我使用 .NET Core 3.1 API,我想配置一个 JWT Bear Token。 我已经配置了一个方法,它生成一个 ValidateLifetime 为一天的令牌。

然后,我将 [authorize] 放在我的 usercontroller 方法上,并使用 Postman 测试了所有内容,使用我的令牌并选择“Bearer Token as Authorization method”,但我不知道为什么它不起作用。

我填写了之前通过我的 GenerateToken 方法生成的令牌,我尝试只输入 jwt 令牌的标头部分,即 jwt 令牌的标头/内容/签名,但它不起作用。

有人有视频或教程来解释如何测试“熊令牌”作为身份验证模式吗?

//生成的令牌示例: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoiYXJ0aHVyIiwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvbmFtZWlkZW50aWZpZXIiOiIxIiwibmJmIjoiMTYxMDI5OTAzMyIsImV4cCI6IjE2MTAzODU0MzMiLCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL3JvbGUiOiJBZG1pbiJ9.E9TnS62nv10gNH8U03OPhK_QrGLEotnS7yjHBvh4i0E P>

        {
            var claims = new List<Claim>{
            new Claim(ClaimTypes.Name , UserNAME),
            new Claim(ClaimTypes.NameIdentifier, userId),
            new Claim(JwtRegisteredClaimNames.Nbf,new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds().ToString()),
            new Claim(JwtRegisteredClaimNames.Exp,new DateTimeOffset(DateTime.Now.AddDays(1)).ToUnixTimeSeconds().ToString())
            };
            claims.Add(new Claim(ClaimTypes.Role, "Admin"));
            var token = new JwtSecurityToken(
                    new JwtHeader(
                        new SigningCredentials(
                            new SymmetricSecurityKey(Encoding.UTF8.GetBytes(SECRET_KEY)),
                            SecurityAlgorithms.HmacSha256
                            )),
                        new JwtPayload(claims));
            var output = new
            {
                Accces_Token = new JwtSecurityTokenHandler().WriteToken(token),
                UserName = UserNAME
            };
            return output;




        }
//this is my authentication services
 services.AddAuthentication(options => {
                options.DefaultAuthenticateScheme = "jwtBearer";
                options.DefaultChallengeScheme = "jwtBearer";
            }).AddJwtBearer("jwtBearer", jwtoptions => {
                jwtoptions.TokenValidationParameters = new TokenValidationParameters()
                {
                    IssuerSigningKey = SIGNING_KEY,
                    ValidateIssuer = false,
                    ValidateAudience = false,
                    ValidateLifetime = true,
                    ClockSkew = TimeSpan.FromMinutes(5) };
            });
//this is my IApplicationBuilder application configure : {
  app.UseAuthentication();
            app.UseAuthorization();```}

【问题讨论】:

    标签: jwt postman asp.net-core-3.1 bearer-token


    【解决方案1】:

    从生成token的代码来看,SIGNING_KEY是一个字符串,而IssuerSigningKeySecurityKey的一个类型。所以在配置中,需要改一下。

    jwtoptions.TokenValidationParameters = new TokenValidationParameters()
                {
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(SIGNING_KEY)),
                   
                };
    

    您测试令牌的方式可能不正确。生成令牌后,将其放入请求标头中。 注意承载者

    【讨论】:

    • 这是我的 SIGNING_KEY ,你可以看到它不是字符串 public static readonly SymmetricSecurityKey SIGNING_KEY = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(SECRET_KEY));
    • @MUTIJIMA,我测试了你的代码,它可以正常工作,你可能会丢失你可以参考答案的承载。
    猜你喜欢
    • 2021-03-19
    • 2020-07-23
    • 2020-02-24
    • 1970-01-01
    • 2018-03-01
    • 2017-09-11
    • 2018-06-22
    • 2020-03-09
    • 2018-08-20
    相关资源
    最近更新 更多