目前的情况:我有一个包含3个WebAPI项目的应用程序(比如API A,B,C)。每个都有基于令牌的身份验证(基于OAuthAuthorizationServerProvider)。有3种用户类型(比方说类型1,2,3)。每个用户类型都存储在单独的数据库表中;
也,
我打算从当前的授权方案迁移到IdentityServer4。所以,我有几个问题:
主要问题:
其他问题:
谢谢!
对于IdentityServer,只有一种类型的用户需要进行身份验证。因此,应将所有用户移动到同一个表(如何迁移是另一个问题)。如果将用户移动到一个表是一个问题,那么IdentityServer可能不是实现安全性的正确工具。虽然可以通过实现自定义用户存储来维护单独的表。可以为每个用户启用双因素身份验证。您可以使用扩展授权来实现自定义授权。
安全的全部目的是保护您的资源:api。在IdentityServer中,资源名称是可以在多个范围中拆分的功能的逻辑名称,其中范围是特定功能。
Api1
可以是具有多个范围的资源(例如Api1.Read
和Api1.Write
)或仅仅是Api1
。但Api1
,Api2
和Api3
也可以成为Api
资源的一部分,其中Api1
,Api2
和Api3
实际上是范围。在你的情况下,Api1
可能是Api1
作为范围的资源。
为了使用户能够访问您需要客户端应用程序的资源,尽管您可以拥有许多可以访问相同资源的客户端。为了支持不同类型的客户端,可以从中选择多种授权类型。
IdentityServer允许您配置完整的图片。
假设有一个客户端可以访问不同的Api,其中每个Api是一个资源/范围。
需要允许客户端代表用户访问Api,因为客户端无法在没有用户的情况下访问资源。
因此,应允许客户端使用某些范围,其中范围需要由客户端请求。没有这个,客户端就无法访问资源。假设客户端配置为Api1
和Api2
,但客户端仅请求Api1
。然后Api2
和Api3
无法到达。
这是顶级授权的一部分。现在是时候让用户参与进来了。当客户端访问api时,api知道哪个用户发出了请求(因为sub
是访问令牌的一部分)。但这还不足以授予或拒绝访问权限。
所以你需要一些东西来授权用户。关于如何实现这一点有很多选择。看看documentation。
考虑一个简单的实现,其中有三个策略。每个策略都确保只有匹配类型的用户才能访问。
那么实际的问题是,如何区分用户的类型?
您可以在UserClaims表中添加声明。假设ClaimType是UserType
,值是1
。在资源中添加一个策略,用于检查声明UserType
和所需的值。
为了让IdentityServer将声明添加到访问令牌,请确保claimType是作用域的一部分(或者在配置多个作用域且需要claimType时为ApiResource)。
通过将claimType UserType
添加到Api_
范围,意味着在访问范围时,必须包含声明。 IdentityServer尝试通过仅对请求的声明进行过滤来限制访问令牌中的声明数。
当用户访问Api_时,声明应该是访问令牌的一部分(假设为每个用户设置了声明,否则用户根本没有访问权限)。您可以为其他api(范围)重复此设置。
在这种情况下,我认为这是一个可以接受的解决方案。其他选择是较低级别(基于资源)或外包的授权,如PolicyServer。
请注意,由于SSO,用户可能也会被其他客户端验证。但由于访问权限仅授予某些类型的用户(作为策略的一部分),因此您可以阻止其他类型的用户访问不适合他们的资源。您可以通过禁用自动登录来防止此行为。