5

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

定义很简单:

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

但我在“带有 ASP.NET Core 2.2 的 JWT 令牌”上找到的大多数解决方案和文章仅适用于 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 开发还很陌生,很多东西都不了解。

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

4

1 回答 1

0

使用我在评论中发布的指南。这不是您所需要的 - 但我不能在评论中发布代码。需要长格式。

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

在你的 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(){ }
于 2019-04-18T21:24:30.463 回答