【问题标题】:How to perform role based authorization without identity framework?如何在没有身份框架的情况下执行基于角色的授权?
【发布时间】:2022-07-08 01:38:21
【问题描述】:

我正在研究一个无需身份框架即可执行身份验证/授权的 Web api。

program.cs 文件的认证配置如下:

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
                .AddJwtBearer(options => ....

登录控制器操作使用用户的登录名设置 JWT 令牌并将其返回给调用者。每个其他控制器操作都具有 [Authorize] 或 [AllowAnonymous] 属性来控制访问。

我的任务是向这个 web api 添加基于角色的授权。例如,我可以将 [Authorize(Roles = "Administrator")] 用于管理控制器操作。在数据库用户表中,我创建了角色列作为用户角色的占位符;从而执行基于角色的授权。

我正在查看此链接:https://docs.microsoft.com/en-us/aspnet/core/security/authorization/roles?view=aspnetcore-6.0 - 但这是关于使用身份时基于角色的授权。但我没有使用身份框架。

我正在考虑的一个解决方案是 - 在登录期间,将角色写入 JWT 令牌,然后为每个角色编写一个属性(将应用于相应的控制器操作),以便比较 JWT 令牌中的角色。

基于角色的授权是否依赖于 .net 身份?或者我可以简单地将 Role 或 Claim 的值设置为 JWT 令牌(在登录期间)并通过通常的 [Authorize(Roles = "Administrator")] 自动执行基于角色的授权,这是否支持?任何关于此的简单示例或参考都会有所帮助。

【问题讨论】:

  • 不是基于身份的,不是。如果您有适当的声明,它应该可以工作。
  • docs.microsoft.com/en-us/dotnet/api/… -- 如果早上没有人回答,我会提供答案。
  • 所以在登录控制器中,当我生成 JWT 令牌时,我是简单地设置 Role 还是在声明中设置角色?我读过一个身份可以有声明,并且一个角色也可以有声明。
  • 角色是特定类型或声明。登录用户由具有声明的身份表示。
  • 你能给我指点关于这个主题的文章吗,会很有帮助的。我想了解这一点 - 用户可以拥有声明和角色,角色可以拥有声明,而您所说的用户(身份)可以拥有声明,但我知道它也可以拥有可以拥有声明的角色,我需要澄清这个话题。

标签: c# .net asp.net-core asp.net-core-webapi asp.net-core-6.0


【解决方案1】:

如果我对您的问题的理解有误,请纠正我,但您是否要实现自定义提供程序以通过您的 API 进行身份验证?

在这里,我实现了一个自定义提供程序,它使用存储在 Ontraport Web 服务中的数据验证用户/通行证。

https://github.com/mysteryx93/OntraportApi.NET/tree/master/OntraportApi.IdentityCore

【讨论】:

  • 目前或未来没有使用身份框架的计划
  • 好吧,我不确定基于角色的身份验证是否与它分开工作......也许是更深层次的抽象,或者是在身份框架发布之前的旧方式?让我们看看其他人怎么说。
【解决方案2】:

生成令牌时,添加“角色”声明

var claims = new Claim[]
            {
                new Claim(ClaimTypes.Name, "Jeffcky"),
                new Claim(ClaimTypes.Role,"Admin")
            };
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("1234567890123456"));

            var token = new JwtSecurityToken(
              issuer: "http://localhost:5000",
              audience: "http://localhost:5001",
              claims: claims,
              notBefore: DateTime.Now,
              expires: DateTime.Now.AddMinutes(5),
              signingCredentials: new SigningCredentials(key, SecurityAlgorithms.HmacSha256)
            );
var token=new JwtSecurityTokenHandler().WriteToken(token);

【讨论】:

    猜你喜欢
    • 2020-03-26
    • 2017-12-23
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2019-05-27
    • 2012-10-24
    相关资源
    最近更新 更多