我正在使用Identityserver4和ASPIdentity进行用户管理。我希望用户没有访问所有应用程序(客户端)的权限。我将添加像UserClients这样的表,该表为用户指定了允许的应用程序。我对您的建议感兴趣,是否可行,是否与SSO的原则相抵触?
答案 0 :(得分:0)
IdentityServer负责客户端访问配置和用户身份验证,但不负责客户端/用户级别的授权。
用户未绑定到客户端。因此,您已经注意到,所有用户都可以访问客户端。无论使用哪个客户端,或者用户是否直接登录IdentityServer,IdentityServer都会对用户进行身份验证。
因此必须授权用户的是客户端(以及api)。
用户是否已通过身份验证(SSO)都无关紧要。客户端/ api的责任是确定用户是否被授权。为了解决这个“问题”,他们建立了PolicyServer,以使身份验证和授权脱钩。
通过添加中间件(在PolicyServer中完成),您可以授予或拒绝用户访问权限。
您可以在IdentityServer中添加一些鉴别符,例如特定的声明类型/角色,使用单独的授权服务器或使用基于资源的授权,例如如果存在(业务)用户,则该用户有权访问。
最后,授权是由需要保护的资源完成的,因为只有资源才能解释声明和业务规则。
您要做的就是在已验证用户无法访问的情况下短路管道。
如果您要“禁用” SSO,那是完全可以的。只需忽略(在客户端中)IdentityServer cookie,从而强制用户(对于该客户端)登录。
但是,当用户无权访问客户端/资源时,您不应拒绝身份验证(例如,返回无效的登录名)。
这就是为什么HTTP状态为401未经授权和403禁止的原因。因此,您可以通知用户未获得使用此客户端的权限。
关于设置,您还可以将声明添加到UserClaims表(而不是创建其他表)以配置允许的应用,例如用户A:
http://mycompany/appname = app1
http://mycompany/appname = app2
http://mycompany/appname = app3
将ClaimType添加到IdentityClaims表和ApiClaims表中,以确保声明使其成为访问/身份令牌。
在客户端/资源中添加中间件,或在其中检查声明类型和所需值的业务规则(策略)。如果不存在,则拒绝访问。例如。 app1应查找值为'app1'的必需声明类型http://mycompany/appname
。