我们目前正在将内部桌面应用程序转移到一系列具有统一Identity Server的Web应用程序上。因此,我们正在利用Identity Server来管理我们的所有用户帐户,并允许它联合访问我们的客户端和API。总的来说,这一切都很好。
然而,我没有找到任何例子,在这些例子中,有人在不使用AspNetCore标识的情况下成功地实现了基于角色或策略的授权。通过IdentityServer管理我的用户,我不希望在我的身份服务器和我的各个Web应用程序之间复制我的用户。相反,我更希望每个Web应用程序管理自己的内部权限。
有没有关于如何在不利用整个AspNetCore标识的情况下实现基于策略的授权的示例?
您的问题的答案是设置一个单独的身份验证服务器和一个独立的授权服务器。正如IdentityServer的创建者之一在这里所评论的:
IdentityServer既是OAuth 2.0又是OpenID Connect实现。是–我们建议使用IdentityServer进行最终用户身份验证,联邦和API访问控制。
PolicyServer是我们对用户授权的建议。
这篇文章本身值得一读,这里有PolicyServer网站的链接。
这个想法很简单,尽管可能有不同的方法。实现可能需要一些时间,因为免费的开源版本使用本地源代码,而您可能希望使用集中式版本。在这种情况下,你可以考虑先看一下商业版。
简而言之,它是如何工作的。首先对用户进行身份验证。然后授权中间件向用户添加声明。然后用户被授权。在代码中,类似于:
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();
这将保持身份验证流不变,并为用户提供"选择加入"授权。为了提高性能,可以使用缓存。
sub
声明是关键。作为oidc流程的一部分,这是唯一一个保持不变的声明。
OSS示例适用于Mvc客户端,但当您使用资源(api(扩展它时,它不会开箱即用。因为访问令牌可能不包含所有声明。
这就是本质,它是最清楚哪些主张是相关的资源。因此,它应该是请求信息的资源。
事实上,这就是本地PolicyServer实现所做的,为客户端和api提供了不同的策略json。您可以将其移动到数据库中,并使用客户端/作用域作为鉴别器,定义每个用户(子(的角色/权限。
api可以使用访问令牌向授权服务器请求信息。为了解决客户端想要知道允许哪些功能的问题,例如,对于构建菜单,您可以使用端点扩展授权服务器,它可以在端点中请求角色/权限列表。