限制客户端的api访问

时间:2018-03-22 08:21:34

标签: oauth oauth-2.0 openid identityserver4

我有一个使用Identity Server 4构建的身份服务器。有一个主要的API,其中有几个角度Web应用程序由访问此API端点的第三方客户构建。

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

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

我唯一能想到的就是检查客户端ID以及API中的一些方法并为其添加策略。对于我的理解,这真的不是正确的,应该检查用户的统计数据,而不是客户端本身。

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

是否可以根据单个客户端ID锁定API?或者我是以错误的方式去做这件事。

我的另一个想法是,如果他们使用此客户端ID登录时会添加另一个声明,这对我来说就像过度杀伤一样。

示例:

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

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

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

与此相反,我突然想到客户端ID作为索赔返回。所以当我今天早上进入时,我检查了一下。

这应该让我只为我们的官方插件添加一个策略。

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

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