控制器 ASP.net 核心 2.1 中的 Jwt 角色身份验证
Posted
技术标签:
【中文标题】控制器 ASP.net 核心 2.1 中的 Jwt 角色身份验证【英文标题】:Jwt Role authentication in controller ASP.net core 2.1 【发布时间】:2019-03-26 11:43:45 【问题描述】:我正在用 asp.net core 2.1 编写一个使用 postgresql 作为数据库的协作 Web API。在用户登录后,用户将获得一个 JWT 令牌,该令牌将用于前端身份验证(前端将使用 Angular 2+ 实现)。我想将用户角色存储在 JWT 中,当用户登录时,将从数据库中读取用户角色并将其存储(授权角色)所以我将在控制器方法上编写角色。我想使用 Authorize 属性。
// Auth Controller
[HttpGet("GetUsers")]
[Authorize(Roles = "admin")]
public ActionResult GetUsers()
var users = _authRepository.GetUsers();
return Ok(users);
和 Repository.cs
public List<User> GetUsers()
var users = _context.Users.ToList();
return users;
问题:我是否需要编写一个中间件来从 JWT 读取每个用户角色并将该角色放入身份主体声明中?请分享你的经验。我很高兴知道你的方法。
【问题讨论】:
不太清楚你在这里问什么......你尝试了什么,什么不起作用? 我想根据 JWT 令牌管理用户角色。我需要一个中间件吗? 如果您使用 Microsoft ASPNET Core Jwt 库/处理程序 (System.IdentityModel.Tokens.Jwt),则传入的经过验证的 JWT 中的任何角色声明都将自动提取并填充到 ClaimsPrincipal (?) 和可与 Authorize(Roles="...")] 属性一起使用。 我也做了同样的事情,它对我有用,谢谢我从 JWT 文档中阅读。身份原则。 【参考方案1】:很高兴我解决了这个问题,我正在共享完整的中间件。在用户的每个请求中,中间件将检查嵌入在 JWT 令牌中间点 xxxx.UserInformation.yyyyy
中的 userRole,我们将获取该用户信息。
public class AuthenticationMiddleware
private readonly RequestDelegate _next;
// Dependency Injection
public AuthenticationMiddleware(RequestDelegate next)
_next = next;
public async Task Invoke(HttpContext context)
//Read the Header
string authHeader = context.Request.Headers["Authorization"];
// If header is not null
if (authHeader != null)
//Fixing the start point and end point
int startPoint = authHeader.IndexOf(".") + 1;
int endPoint = authHeader.LastIndexOf(".");
var tokenString = authHeader.Substring(startPoint, endPoint - startPoint).Split(".");
var token = tokenString[0].ToString()+"==";
var credentialString = Encoding.UTF8
.GetString(Convert.FromBase64String(token));
// Splitting the data from Jwt
var credentials = credentialString.Split(new char[] ':',',' );
// Trim this string.
var userRule = credentials[5].Replace("\"", "");
var userName = credentials[3].Replace("\"", "");
// Identity Principal
var claims = new[]
new Claim("name", userName),
new Claim(ClaimTypes.Role, userRule),
;
var identity = new ClaimsIdentity(claims, "basic");
context.User = new ClaimsPrincipal(identity);
//will move to the next middlware
await _next(context);
现在我们需要通过 goint 到 Startup.cs 在应用启动时调用这个中间件
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
if (env.IsDevelopment())
app.UseDeveloperExceptionPage();
// Authorization Middleware
app.UseMiddleware<AuthenticationMiddleware>();
// Other Middleware will come here
app.UseMvc();
现在转到控制器并在方法上放置一个属性。如果角色是管理员,它将执行该方法,否则它将返回 403 状态代码。
[HttpGet("GetUsers")]
[Authorize(Roles = "admin")]
public ActionResult GetUsers()
var users = _authRepository.GetUsers();
return Ok(users);
我希望这对所有将在 asp.net 核心所有版本中使用 JWT 身份验证进行身份验证和授权的人有所帮助。
【讨论】:
甚至可以在角色中添加两个值。以上是关于控制器 ASP.net 核心 2.1 中的 Jwt 角色身份验证的主要内容,如果未能解决你的问题,请参考以下文章
JWT:如何从声明中的特定键获取值列表。 C# Asp.Net 核心