在IdentityServer4中限制用户级别的api资源
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在IdentityServer4中限制用户级别的api资源相关的知识,希望对你有一定的参考价值。
我们想要使用IdentityServer4来设置一般身份验证服务,我们在其中定义了一组可以访问一个或多个api的用户。
用户将被全局定义,但只能访问特定的api。
也许我错过了一些东西,但似乎并没有得到支持。如果用户通过身份验证并收到访问令牌,则他可以访问所有api。
我已经阅读了博客文章https://leastprivilege.com/2016/12/16/identity-vs-permissions/,我完全理解并同意授权应该在客户端应用程序本身中处理,但是第一级检查用户是否可以访问api对我来说似乎微不足道。
之前我使用过Azure AD和ADAL,在Azure AD中,可以定义用户可以访问它的应用程序(= IdentityServer4术语中的资源)。请求令牌时,您可以指定要访问的资源,如果用户无权访问该资源,则不会返回任何访问令牌。
任何人都可以告诉我什么是正确的设置方法?我们的大多数应用程序都是Angular SPA应用程序,因此我们使用隐式流程。
我会建议你用这种方式做一些高级别的想法,
- 验证用户并确保其返回访问令牌和某些声明信息
- 在数据存储中或您可以读取的可以将声明映射到权限/属性的位置定义授权规则。
- 现在编写一个授权逻辑或服务,您可以在其中映射步骤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
正确的方法是使用Policy-based或Role-based授权。
身份服务器正在进行身份验证(检查客户端是否已注册,是否允许访问请求的范围,对用户进行身份验证,并向其提供声明)但是由您的应用程序(客户端)授权用户(基于关于权利要求中的角色,允许或不访问某种方法)。
在对IDS进行身份验证以检查clientID和用户时,您有一个选项,并编写一些自定义Profile Service,您可以在其中应用某些规则并拒绝用户。
以上是关于在IdentityServer4中限制用户级别的api资源的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Windows 中(在用户模式下)中限制应用程序域级别的带宽?
Asp.Net Core 中IdentityServer4 实战之角色授权详解
Asp.net core IdentityServer4与传统基于角色的权限系统的集成