【问题标题】:How to use permission level with JWT?如何在 JWT 中使用权限级别?
【发布时间】:2019-01-13 11:55:02
【问题描述】:

我有一个 .net core 2.0 WebAPI,我使用 JWT 作为 HttpOnly cookie 来保护它。 我现在正在尝试为每个端点实现基于位的权限级别,并且我正在尝试了解它是否可以在 JWT cookie 中完成。 例如,我有一个基本的访问级别枚举:

[Flags]
public enum AccessLevel
{
    Read = 1,
    Write = 2,
    Modify = 4,
    Delete = 8,
    FullControl = 15
}

我可以像这样向我的令牌添加声明吗:

var claims = new List<Claim>
{
    new Claim("StudentsAccessLevel", "3"),
    new Claim("CoursesAccessLevel", "7")
};

并以某种方式在我的StudentsController 中使用它:

public class StudentsController : Controller
{
    [HttpPost]
    //obviously this is not the syntax, but is there a syntax that can be used like that?
    [Authorize("StudentsAccessLevel" & 1 > 0)]
    public  IActionResult Create() { }

    [HttpGet]
    [Authorize("StudentsAccessLevel" & 2 > 0)]
    public IActionResult Read() { }

    [HttpPut]
    [Authorize("StudentsAccessLevel" & 4 > 0)]
    public IActionResult Update() { }

    [HttpDelete()]
    [Authorize("StudentsAccessLevel" & 8 > 0)]
    public IActionResult DeleteAsync() { }
}

【问题讨论】:

  • 因此,您可以直接从文档中获取有关处理索赔的更多信息。这是一个链接:docs.microsoft.com/en-us/aspnet/core/security/authorization/… 如果这还不够,请告诉我
  • @rahicks,感谢您的链接,但这与我正在寻找的具有操作访问级别的实现不太匹配。在链接中描述的方法中,我必须为每个操作(创建、读取、更新、删除)添加一个声明。
  • 不确定这是否是最好的方法,但我会尝试的第一件事是覆盖授权属性 [docs.microsoft.com/en-us/previous-versions/aspnet/…] 并使其适用于您的声明
  • @rahicks,您的链接出现 404 错误...也许我可以使用这个 using-a-func-to-fulfill-a-policy
  • 是的,我在最后添加 ] 应该没问题

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


【解决方案1】:

为了根据他们所属的角色影响实际应用于给定用户身份验证的范围,您可以在 Auth0 Dashboard 中定义一个规则。这是一个非常简单的例子:

function (user, context, callback) {

  user.app_metadata = user.app_metadata || {};

   if (user.app_metadata.role === "Administrator") {
     context.accessToken.scope = 'openid read:posts create:posts edit:posts';
   } else if (user.app_metadata.role === "User") {
  ...  // define likewise as needed..
   }

   callback(null, user, context);
}

角色是静态应用于用户配置文件还是动态查找等,不太清楚,取决于您的要求。但是,如果您进行了设置,您应该会收到一个 JWT 访问令牌,其有效负载包含以下内容(适用于身份验证用户具有管理员角色的情况。

enter image description here

然后,您可以保护您的 .NET Core API 以相应地验证访问令牌。如果您不使用 API,那么理论上您“可以”改用 ID 令牌......(因为应用程序本身就是消费者)。但我基于以上理解您希望授权针对某些 API 的请求...?

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2018-01-09
  • 1970-01-01
  • 2020-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-02
  • 2017-11-29
相关资源
最近更新 更多