【问题标题】:Restricting an api resource on user level in IdentityServer4在 IdentityServer4 中限制用户级别的 api 资源
【发布时间】:2018-06-14 03:05:11
【问题描述】:

我们想建立一个通用的身份验证服务,利用 IdentityServer4,我们在其中定义了一组可以访问一个或多个 api 的用户。

用户将被全局定义,但只能访问特定的 api。

也许我遗漏了一些东西,但这似乎不受支持。如果用户通过身份验证并收到访问令牌,则他可以访问所有 api。

我已阅读博文https://leastprivilege.com/2016/12/16/identity-vs-permissions/,我完全理解并同意应该在客户端应用程序本身中处理授权,但是检查用户是否可以访问 api 的第一级检查对我来说似乎微不足道。

我之前使用过 Azure AD 和 ADAL,在 Azure AD 中,可以定义用户可以访问的应用程序(=IdentityServer4 术语中的资源)。请求令牌时,您指定要访问的资源,如果用户无权访问它,则不会返回访问令牌。

谁能告诉我设置的正确方法是什么?我们的大多数应用程序都是 Angular SPA 应用程序,因此我们使用隐式流程。

【问题讨论】:

  • 身份服务是错误的地方做用户授权。如果你绝对希望你可以实现一个自定义授权请求验证器来做额外的检查。

标签: api oauth identityserver4 oidc-client-js


【解决方案1】:

我会建议你这样做的一些高级想法,

  1. 对用户进行身份验证并确保它返回 access_token 和 certian 声明信息
  2. 在您的数据存储或您可以读取的位置定义授权规则,以将声明映射到权限/属性。
  3. 现在编写一个授权逻辑或服务,您可以在其中映射第 2 步中的有效权限并寻求权限。

这样你就可以保持你的身份和授权干净和独立,并且只根据需要更新应用程序的规则以映射一般权限

【讨论】:

    【解决方案2】:

    您可以设置不同的客户端来访问不同的 API,用户只需对客户端进行身份验证,他们就可以访问该 API。这不会阻止 user1 对您不希望他们访问的 api 进行身份验证。

    您还可以设置用户声明和政策,以防止不同的用户访问不同的 api。这样的事情将确保只有年满 21 岁的用户才能访问此 API。

    [Authorize(Policy = "AtLeast21")]
    public class AlcoholPurchaseController : Controller
    {
        public IActionResult Login() => View();
    
        public IActionResult Logout() => View();
    }
    

    更多信息可以在这里找到Custom policy-based authorization

    【讨论】:

      【解决方案3】:

      正确的方法是使用Policy-basedRole-based 授权。

      身份服务器正在执行身份验证(检查客户端是否已注册,是否允许访问请求的范围,对用户进行身份验证,并向他提供声明)但由您的应用程序(客户端)授权用户(根据声明中的角色,允许或不允许访问某个方法)。

      在针对 IDS 进行身份验证时,您可以选择检查 clientID 和用户,并编写一些自定义 Profile Service,您可以在其中应用一些规则并拒绝用户。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-09-08
        • 1970-01-01
        • 2018-01-23
        • 2021-09-18
        • 2019-12-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多