IdentityServer4:如何为 api 中的当前用户添加角色?

IdentityServer4: How to add roles to current user in api?

我有一个 IdentityServer 用于少数应用程序的身份部分。每个应用程序都有一个 api 和一个 webgui。到目前为止,一切都很好。现在我想通过 Authorize[Role="Admin, …"] 属性保护 api。

在 IdentityServer 上的声明中添加角色没有多大意义,因为每个应用程序都有不同的角色,并且可以根据应用程序为每个用户分配不同的角色。我尝试实施运行良好的策略规则,但使用此解决方案我无法执行 "or" 授权规则(用户应处于 Admin 或 Management 角色才能获得此操作的授权)。所以这也不是一个选择。我认为解决方案应该是,创建一个将角色添加到当前用户的服务,但我不知道该怎么做。

经过几个小时的搜索,我仍然没有找到适合这种情况的东西,我可以继续申请。

查看 https://leastprivilege.com/2016/12/16/identity-vs-permissions/

最佳做法是将角色分配给用户,然后将这些角色分配给您的 IdentityServer 中的 "Application Roles"。在您的应用程序中,您将检查是否存在 "Application Roles"。

这允许您将用户的属性与应用程序的业务逻辑分离。

IdentityServer 只是对主体进行身份验证并returns 声明主体。差不多就是这样。其他一切都由您的后备商店处理。如果您已经与 Identity 集成,换句话说,您将以使用 Identity 的标准方式向用户添加角色。

不过,下一个问题是声明(哪些角色是)与委托人一起发送,重要的是,没有更新。获取更新声明的唯一方法是获取新主体,这通常涉及重新验证。在典型的 Web 应用程序场景中,您会使安全令牌无效,这将提示用户再次登录。从 API 的角度来看,这也应该会在请求受保护的端点时引起 401 响应,这应该会导致客户端从您的身份验证端点检索新的访问令牌。

就用户是否担任管理员或管理角色进行授权之类的操作而言,基于策略的授权完全能够处理这些问题。我不确定你为什么认为它不能。您可以从字面上创建类似 AdminOrManagementRequirement 的内容以及关联的处理程序。然后,您只需应用 Authorize 属性,例如:

[Authorize(Policy = "AdminOrManagement")]

当然,使用您在 Startup 中注册保单时使用的任何名称。