ASP.NET Core 2.2 JWT身份验证

5
我最近一直在学习ASP.NET Core 2.2,并尝试使用JWT令牌开发基于角色的登录示例(网站+Web API)。
定义很简单:
  • 如果用户的角色是“管理员”,则重定向到管理员页面。
  • 如果用户的角色是“用户”,则重定向到用户页面。
但我发现大多数关于“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开发者,不太了解很多东西。
任何帮助都将不胜感激。提前致谢。

@CamiloTerevinto,您的理解是正确的。我有单独的后端API和前端应用程序。我想在登录按钮点击时调用Authenticate API并从API获取令牌。我想从ASP.Net Core调用后端。 - vishwas-trivedi
@CamiloTerevinto 我从链接的文章中推断出,这将是Web应用程序开发中的常见做法。 - vishwas-trivedi
我并没有完全理解你的问题。不过,我看了这个指南:https://jonhilton.net/2017/10/11/secure-your-asp.net-core-2.0-api-part-1---issuing-a-jwt/ - Cody Popham
@CodyPopham 请查看我问题中的定义。我的问题是API知道授权信息,但我应该如何通知客户端应用程序,我想根据用户的角色(声明)进行重定向。 - vishwas-trivedi
@CodyPopham 我想创建一个单一的登录表单,并根据用户的角色进行重定向。 - vishwas-trivedi
显示剩余11条评论
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(){ }

1
这似乎是API端的代码。我在API端使用claims发放令牌时没有遇到任何问题,问题是如何在客户端(网站)上使用该claim根据用户角色进行登录。 - vishwas-trivedi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接