簡體   English   中英

為什么我在 Asp.Net CORE 中使用 JWT 獲得 401 未經授權的工作?

[英]Why I'm getting a 401 unauthorized working with JWT in Asp.Net CORE?

我正在嘗試使用 JsonWebTokens(JWT) 在 Asp.net CORE 中進行用戶身份驗證。

當我在我的應用程序中運行登錄方法時,令牌已正確生成,但是,當我嘗試將 go 設置為受[Authorize]屬性限制的方法時,我收到 401 未經授權的錯誤。

Bearer error=\"invalid_token\", error_description=\"簽名無效\"

這就是我在StartupConfigureServices方法中配置的方式:

services.AddAuthentication(x =>
        {
            x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;

        }).AddJwtBearer(x =>
        {
            var key = Encoding.ASCII.GetBytes("asdwda1d8a4sd8w4das8d*w8d*asd@#");
            var signingKey = new SymmetricSecurityKey(key);

            x.RequireHttpsMetadata = false;
            x.SaveToken = true;
            x.TokenValidationParameters = new TokenValidationParameters()
            {
                ValidateIssuerSigningKey = true,
                IssuerSigningKey = signingKey,
                ValidAudience = "Audience",
                ValidIssuer= "Issuer",
                ValidateIssuer = false,
                ValidateAudience = false
            };
        });

這就是我在Startup的配置中的配置方式:

app.UseAuthentication();

這是LoginController中的令牌生成:

                var tokenDescriptor = new SecurityTokenDescriptor
            {
                Subject = new ClaimsIdentity(new Claim[]
                {
                    new Claim("UserID", login.IdUsuario.ToString())
                }),
                Expires = DateTime.UtcNow.AddDays(1),
                SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(Encoding.ASCII.GetBytes("asdwda1d8a4sd8w4das8d*w8d*asd@#")), 
            SecurityAlgorithms.HmacSha256Signature)
            };
            var tokenHandler = new JwtSecurityTokenHandler();
            var securityToken = tokenHandler.CreateToken(tokenDescriptor);
            var token = tokenHandler.WriteToken(securityToken);

            return Ok( new { token } );

這是我限制的 class ,與拒絕訪問相同

[HttpGet]
[Authorize]
[Route("Profile")]
public IActionResult Profile()
{
     string userID = User.Claims.First(c => c.Type == "UserID").Value;
     var resultado = _UsuarioServicio.Profile(int.Parse(userID));
     return Ok(resultado);
}

我正在使用 postman 對此進行測試,並且我已經添加了相應的 header。

非常感謝您花時間看這個!

令牌中的key與您在配置中設置的不匹配。 他們必須完美匹配。

請在生成令牌和驗證令牌時使用相同的對稱密鑰。 從您共享的代碼中,在生成令牌時,您將簽名密鑰用作“1234..”,但在 startup.cs 中進行驗證時,您正在使用“ab de..”。 這就是為什么,它抱怨簽名無效,因為兩個密鑰都不匹配。

另外,請將密鑰存儲在安全的配置文件中。 如果是實時的,請使用非對稱密鑰(公鑰和私鑰)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM