控制器 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 角色身份验证的主要内容,如果未能解决你的问题,请参考以下文章

asp.net 核心中的 jwt 令牌无效

uri查询参数中的asp.net核心JWT?

asp.net 核心中的 JWT 身份验证验证

JWT:如何从声明中的特定键获取值列表。 C# Asp.Net 核心

通过 ASP.NET 核心身份中的角色声明进行 JWT 身份验证

签名证书 jwt asp.net 核心中的密钥长度应该是多少