C# ASP.NET Core 2.2 JWT身份验证
最近我一直在学习ASP.NET Core 2.2,并尝试使用JWT令牌开发一个基于角色的登录示例(网站+Web API) 定义很简单:C# ASP.NET Core 2.2 JWT身份验证,c#,asp.net-core,asp.net-core-mvc,jwt-auth,C#,Asp.net Core,Asp.net Core Mvc,Jwt Auth,最近我一直在学习ASP.NET Core 2.2,并尝试使用JWT令牌开发一个基于角色的登录示例(网站+Web API) 定义很简单: 若用户的角色是“管理员”,那个么它会重定向到管理员页面 若用户的角色是“用户”,那个么它将重定向到用户页面 但我在“带ASP.NET Core 2.2的JWT令牌”上找到的大多数解决方案和文章都只针对Web API 从下面的文章中,我几乎了解了JWT令牌的工作原理以及如何在Web API端实现它: 现在我的问题是如何使用ASP.NET核心网站使用上述API
- 若用户的角色是“管理员”,那个么它会重定向到管理员页面
- 若用户的角色是“用户”,那个么它将重定向到用户页面
提前感谢。使用我在评论中发布的指南。这并不是你所需要的全部——但我不能在评论中发布代码。需要很长的表格 您可以使用声明将角色放入您的令牌中 在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端验证JWT(大概是通过
[Authorize]
控制器上的属性,但您想知道如何读取和使用应用程序前端部分的令牌吗?@CamiloTerevinto编辑以修复,只是一个错误。如果我理解正确,您有一个前端应用程序和一个分离的后端应用程序,因此这不是一个简单的问题。后端应用程序需要生成并验证JWTs,但前端应用程序是从ASP.NET Core还是从JavaScript调用后端应用程序?@UpQuark是的,没错,我想知道如何在前端应用程序上读取和使用令牌。@Camilotervin您的理解是正确的。我有单独的后端API和前端应用程序。我想在上调用Authenticate API登录按钮单击并从API获取令牌。我想从ASP.Net Core调用后端。这似乎是API端的代码。从API端发出令牌并声明,我没有遇到任何问题,问题是如何在客户端(网站)上使用该声明根据用户角色登录。