ASP.NET Core 2.2 JWT 身份验证

Posted

技术标签:

【中文标题】ASP.NET Core 2.2 JWT 身份验证【英文标题】:ASP.NET Core 2.2 JWT Authentication 【发布时间】:2019-09-06 01:28:52 【问题描述】:

我最近一直在学习 ASP.NET Core 2.2,并尝试使用 JWT 令牌开发基于角色的登录示例(网站 + Web API)。

定义很简单:

如果用户的角色是“admin”,那么它会重定向到管理页面。 如果用户的角色是“用户”,那么它会重定向到用户页面。

但我在“JWT token with ASP.NET Core 2.2”上找到的大多数解决方案和文章仅适用于 Web API。

通过以下文章,我几乎了解了 JWT 令牌的工作原理以及如何在 Web API 端实现它:

http://jasonwatmore.com/post/2019/01/08/aspnet-core-22-role-based-authorization-tutorial-with-example-api

现在我的问题是如何使用 ASP.NET Core 网站使用上述 API?

对于很多人来说,这可能是一个简单的问题,但我对 Web 开发还很陌生,很多东西都不懂。

任何帮助将不胜感激。 提前致谢。

【问题讨论】:

所以澄清一下,您可以在 API 端验证 JWT(可能在控制器上使用 [Authorize] 属性,但您想知道如何在前端读取和使用令牌您的应用程序的一部分? @CamiloTerevinto 编辑修复,只是一个失误。 如果我理解正确的话,你有一个前端应用程序和一个分离的后端应用程序,所以这不是一个简单的问题。后端应用程序需要生成和验证 JWT,但前端应用程序是从 ASP.NET Core 还是从 javascript 调用后端? @UpQuark 是的,我想知道如何在前端应用程序中读取和使用令牌。 @CamiloTerevinto 您的理解是正确的。我有单独的后端 API 和前端应用程序。我想在登录按钮单击时调用 Authenticate API 并从 API 获取令牌。我想从 ASP.Net Core 调用后端。 【参考方案1】:

使用我在 cmets 中发布的指南。这不是您需要的全部 - 但我无法在 cmets 中发布代码。需要长格式。

您使用声明将角色放入您的令牌中。

在你的 startup.cs 中

   var secretKey = Configuration.GetSection("JWTSettings:SecretKey").Value;
    var issuer = Configuration.GetSection("JWTSettings:Issuer").Value;
    var audience = Configuration.GetSection("JWTSettings:Audience").Value;

    var signingKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(secretKey));
    var tokenValidationParameters = new TokenValidationParameters
    
        ValidateIssuerSigningKey = true,
        IssuerSigningKey = signingKey,
        ValidateIssuer = true,
        ValidIssuer = issuer,
        ValidateAudience = true,
        ValidAudience = audience,
        ValidateLifetime = true,
        ClockSkew = TimeSpan.Zero,
    ;

    services.AddAuthentication(options =>
    
        options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
        options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    ).AddJwtBearer(options =>
    
        options.RequireHttpsMetadata = false;
        options.TokenValidationParameters = tokenValidationParameters;
    );

然后在用户用来“登录”或颁发令牌的控制器方法中。

var claims = new[] 
                            new Claim(ClaimTypes.Name, Credentials.Email),
                            new Claim(ClaimTypes.Role, Role) ;
    var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_options.SecretKey));
    var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

    var token = new JwtSecurityToken(
                                issuer: _options.Issuer,
                                audience: _options.Audience,
                                claims: claims,
                                expires: DateTime.Now.AddYears(10),
                                signingCredentials: creds);

然后用角色保护你的方法或控制器。

 [Authorize(Roles = "Admin")]
   [HttpGet]
   Public IActionResult GrabStuff() 

【讨论】:

这似乎是API端的代码。我从 API 端发出带有声明的令牌没有任何问题,问题是如何在客户端(网站)上使用该声明来根据用户角色登录。

以上是关于ASP.NET Core 2.2 JWT 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

asp.Net core 2.2中的多种身份验证方法

JWT 身份验证 ASP.NET Core MVC 应用程序

ASP.NET Core 2.2 中的 Azure AD 身份验证

Asp.Net Core 2.2 - 如何在使用两个 AuthorizationSchemes、JWT 和 cookie 时返回当前用户 ID

ASP.NET Core 中的 Jwt 令牌身份验证

ASP.NET Core JWT 身份验证受众属性