【问题标题】:Restricting api access by client限制客户端的 api 访问
【发布时间】:2018-08-31 14:21:33
【问题描述】:

我有一个使用身份服务器 4 构建的身份服务器。有一个主 API,其中包含由访问此 API 端点的第三方客户构建的多个 Angular Web 应用程序。

现在我想创建第二个 API,但它只供 OUR 官方插件在内部使用。我试图弄清楚如何将其锁定,以便只有我们的应用程序可以访问它。我不是默默无闻的粉丝安全,并假设第三方不知道它在那里,所以不会尝试访问它。

我的第一个想法是为这个 API 添加一个新范围,但这样做会弹出并要求用户访问不需要的数据。

我唯一能想到的就是在 API 中检查客户端 ID 并为其添加策略。就我的理解而言,这确实不是正确的 polciy 应该检查用户的统计信息,而不是客户端本身。

services.AddAuthorization(
    options => {
        options.AddPolicy("DevConsole", policy => IsClientId(xxxx)
    }
);

是否可以根据单个客户端 ID 锁定 API?还是我走错路了。

我的另一个想法是添加另一个声明,如果他们使用这个客户端 ID 登录,这对我来说有点矫枉过正。

示例:

假设我有一个 API 端点,允许您更新用户名。所有用户都可以访问他们的名字,这不是范围问题。但是,只有我们的官方应用程序有权更新用户名。第三方开发者创建的任何应用都无权访问端点来更新用户名。

所以我们的官方插件的客户端 ID 为 123,而您的客户端 ID 为 321。通过客户端 ID 321 登录的用户无法访问此端点。通过客户端 id 123 登录的用户可以。

我开始认为这是不可能的,因为 Oauth 和 Openid 完全基于用户。无法根据用户进行身份验证的客户端来验证用户。

【问题讨论】:

  • 你说的"是什么意思...要求用户访问那些不是真正需要的数据"?我认为您的官方插件的用户只需要批准(在同意页面上)将新范围权限委派给插件。这是一个问题还是为什么不需要它?
  • 任何登录的人都可以访问这些数据。用户登录的客户端可能有权或可能无权请求数据。范围是基于用户的,它请求访问每个人都可以访问此数据的用户数据。但是,如果您创建一个应用程序并且我给您一个客户端 ID,您将无权使用此 api。
  • @JánHalaša 检查我的更新我添加了一个我正在尝试做的示例。
  • 你能解释一下你对范围的关注吗?我通过访问获得了这个,但它与 API 限额无关。通用 API 可以读取数据,但只有您自己可以编辑。只有拥有您的范围的客户端才能访问您的 API。我错过了什么吗?
  • 主要问题是管理层不想向用户显示额外的范围。因为它会迫使每个人都集中注意力,而且当数据在第一个范围内已经可以访问时,拥有第二个范围是愚蠢的

标签: oauth oauth-2.0 openid identityserver4


【解决方案1】:

在反复讨论这个问题后,我发现客户端 ID 作为声明返回。所以当我今天早上进来时,我检查了。

这应该使我能够为我们的官方插件添加策略。

services.AddAuthorization(options =>
            {
                options.AddPolicy("IsOfficalApp", policy => IsCheckOfficalClient());
            });

这应该使我能够锁定有问题的 API 端点,而无需用户的额外授权。

【讨论】:

    【解决方案2】:

    如果我正确理解问题,我会在 Identity Server 上为“主 API”创建一个新客户端,并为“内部 API”创建一个新资源

    这将允许“主 API”也成为客户端,具有客户端凭据授予类型,因此它具有 id+secret 并允许为自己请求令牌。在这种情况下,您现在将在“内部 API”中请求新创建的范围,用户将不知道该实体是否存在。

    【讨论】:

      猜你喜欢
      • 2017-10-10
      • 1970-01-01
      • 1970-01-01
      • 2017-06-07
      • 1970-01-01
      • 2015-07-17
      • 2021-05-18
      • 2019-07-15
      • 1970-01-01
      相关资源
      最近更新 更多