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 身份验证的主要内容,如果未能解决你的问题,请参考以下文章
JWT 身份验证 ASP.NET Core MVC 应用程序
ASP.NET Core 2.2 中的 Azure AD 身份验证
Asp.Net Core 2.2 - 如何在使用两个 AuthorizationSchemes、JWT 和 cookie 时返回当前用户 ID