没有 AspNetCore Identity 的角色和策略授权?

Role and Policy Authorization without AspNetCore Identity?

我们目前正在将内部桌面应用程序转移到一系列具有统一 Identity Server 的 Web 应用程序。因此,我们正在利用 Identity Server 来管理我们所有的用户帐户,并允许它联合访问我们的客户端和 API。总的来说,这一切都很好。

但是,我没有找到任何示例,其中有人在不使用 AspNetCore Identity 的情况下设法实现了基于角色或策略的授权。通过 IdentityServer 管理我的用户,我宁愿不必在我的身份服务器和我的个人 Web 应用程序之间复制我的用户,而是更愿意让每个 Web 应用程序管理自己的内部权限。

是否有任何示例说明如何在不利用整个 AspNetCore Identity 的情况下实现基于策略的授权?

你的问题的答案是设置一个单独的认证服务器和单独的授权服务器。正如 IdentityServer 的一位创建者所评论的 here

IdentityServer is both an OAuth 2.0 and OpenID Connect implementation. Yes – we recommend to use IdentityServer for end-user authentication, federation and API access control.

PolicyServer is our recommendation for user authorization.

文章本身值得一读,这里是 link PolicyServer 网站。

这个想法很简单,尽管可能有不同的方法。实施可能需要一些时间,因为免费的开源版本使用本地源,而您可能希望使用集中式版本。这种情况可以考虑先看看商业版

简而言之,它是如何工作的。首先对用户进行身份验证。然后授权中间件向用户添加声明。然后用户被授权。在 code 中,类似于:

app.UseAuthentication();

// add this middleware to make roles and permissions available as claims
// this is mainly useful for using the classic [Authorize(Roles="foo")] and IsInRole functionality
// this is not needed if you use the client library directly or the new policy-based authorization framework in ASP.NET Core
app.UsePolicyServerClaims();

app.UseAuthorization();

这将使身份验证流程保持完整,并为用户提供 'opt-in' 授权。要加快性能,您可以使用缓存。

sub 声明是关键。作为 oidc 流程的一部分,这是唯一保持不变的声明。

OSS 示例适用于 Mvc 客户端,但当您使用资源 (api) 对其进行扩展时,它无法开箱即用。因为访问令牌可能不包含所有声明。

这就是本质,它是最了解相关声明的资源。所以应该是请求信息的资源。

事实上,这是本地 PolicyServer 实现所做的,对客户端和 api 的不同策略 json。您可以将其移至数据库并使用 client/scope 作为鉴别器,定义每个用户(子)的角色/权限。

api可以使用访问令牌向授权服务器请求信息。解决客户想知道允许哪些功能的问题,例如对于构建菜单,您可以使用端点扩展授权服务器,它可以在其中请求角色/权限列表。