我们目前正在将我们的内部桌面应用程序转移到一系列具有统一身份服务器的Web中。因此,我们正在利用Identity Server来管理我们的所有用户帐户,并允许它联合访问我们的客户端和API。总的来说,这一切都很好。
然而,在没有使用AspNetCore身份的情况下,我并没有很好地找到某些人成功地实现了角色或基于策略的授权的例子。使用IdentityServer管理我的用户,我不希望在身份服务器和单独的own应用程序之间复制我的用户,相反,我更愿意让每个own应用程序管理自己的内部权限。
有没有关于如何在不充分利用AspNetCore标识的情况下实现基于策略的授权的示例?
发布于 2019-11-19 05:14:21
您的问题的答案是设置一个独立的身份验证服务器和单独的授权服务器。正如这里的一位创建者所评论的,IdentityServer:
IdentityServer是一个OAuth 2.0和OpenID连接实现。是的-我们建议使用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流的一部分,这是唯一保持不变的说法。
对于Mvc客户端,OSS示例运行良好,但是当您用资源(api)扩展它时,它将不起作用。因为访问令牌可能不包含所有声明。
这就是它的本质,它是最清楚什么主张是相关的资源。所以它应该是请求信息的资源。
实际上,这就是本地PolicyServer实现所做的,对于客户端和api是一个不同的策略json,您可以将它移到数据库中,并使用客户机/作用域作为鉴别器,为每个用户(子)定义角色/权限。
api可以使用访问令牌从授权服务器请求信息。为了解决客户端希望知道哪些功能被允许的问题,例如构建菜单,您可以使用端点扩展授权服务器,在该端点中,它可以请求角色/权限列表。
https://stackoverflow.com/questions/58921978
复制相似问题