Security » Authorization » 基于资源的授权
Resource Based Authorization¶ 基于资源的授权
Often authorization depends upon the resource being accessed. For example a document may have an author property. Only the document author would be allowed to update it, so the resource must be loaded from the document repository before an authorization evaluation can be made. This cannot be done with an Authorize attribute, as attribute evaluation takes place before data binding and before your own code to load a resource runs inside an action. Instead of declarative authorization, the attribute method, we must use imperative authorization, where a developer calls an authorize function within his own code.
授权经常要取决于访问的资源。例如,某个文档可能有一个作者属性。按照逻辑只允许该文档的作者进行更新,所以在做授权检查前,资源必须能从文档库中将其加载。这些功能靠Authorize属性是做不到的,因为属性检查发生在数据绑定前,同样也在相应方法内你编制的加载资源的代码之前发生。我们不能使用采用属性方法的声明性授权方式,而必须使用命令式授权,在其中,一个开发者在自己的代码中调用授权函数。
Authorizing within your code¶ 代码中的授权
Authorization is implemented as a service, IAuthorizationService, registered in the service collection and available via dependency injection for Controllers to access.
要通过服务的形式实现授权------IAuthorizationService,在服务集合中进行注册,并在控制器中通过依赖注入的方法进行使用。
public class DocumentController : Controller
{
IAuthorizationService _authorizationService; public DocumentController(IAuthorizationService authorizationService)
{
_authorizationService = authorizationService;
}
}
IAuthorizationService has two methods, one where you pass the resource and the policy name and the other where you pass the resource and a list of requirements to evaluate.
IAuthorizationService 具有两个方法,一个是传入的资源和策略名称,另一个是传递的资源和待检查要求的列表。
Task<bool> AuthorizeAsync(ClaimsPrincipal user,
object resource,
IEnumerable<IAuthorizationRequirement> requirements);
Task<bool> AuthorizeAsync(ClaimsPrincipal user,
object resource,
string policyName);
To call the service load your resource within your action then call the AuthorizeAsync overload you require. For example
先在方法中调用资源服务,再调用AuthorizeAsync 加载你的需求。例如:
public async Task<IActionResult> Edit(Guid documentId)
{
Document document = documentRepository.Find(documentId); if (document == null)
{
return new HttpNotFoundResult();
} if (await authorizationService.AuthorizeAsync(User, document, "EditPolicy"))
{
return View(document);
}
else
{
return new ChallengeResult();
}
}
Writing a resource based handler¶ 编写基于资源的处理器
Writing a handler for resource based authorization is not that much different to writing a plain requirements handler. You create a requirement, and then implement a handler for the requirement, specifying the requirement as before and also the resource type. For example, a handler which might accept a Document resource would look as follows;
编写基于资源的授权处理程序与编写一个普通的需求处理程序并没有太大不同。先新建一个需求,然后执行该资源的处理程序,对该需求和资源类型进行指定。例如,一个可以接受Document资源的处理程序是这样的:
public class DocumentAuthorizationHandler : AuthorizationHandler<MyRequirement, Document>
{
public override Task HandleRequirementAsync(AuthorizationHandlerContext context,
MyRequirement requirement,
Document resource)
{
// Validate the requirement against the resource and identity. return Task.CompletedTask;
}
}
Don’t forget you also need to register your handler in the ConfigureServices method;
不要忘记你也需要在ConfigureServices 方法中注册该处理程序。
services.AddSingleton<IAuthorizationHandler, DocumentAuthorizationHandler>();
Operational Requirements¶ 可使用的要求
If you are making decisions based on operations such as read, write, update and delete, you can use the OperationAuthorizationRequirement class in the Microsoft.AspNetCore.Authorization.Infrastructure namespace. This prebuilt requirement class enables you to write a single handler which has a parameterized operation name, rather than create individual classes for each operation. To use it provide some operation names:
如果你基于诸如读、写、改、删等操作进行决策,你可使用Microsoft.AspNetCore.Authorization.Infrastructure 命名空间的OperationAuthorizationRequirement 类。这个预先建好的需求类可使你使用参数化的操作名称将这些操作都编写到一个处理程序中,而不是为每个操作都新建一个单独的类。通过提供一些操作的名称来使用:
public static class Operations
{
public static OperationAuthorizationRequirement Create =
new OperationAuthorizationRequirement { Name = "Create" };
public static OperationAuthorizationRequirement Read =
new OperationAuthorizationRequirement { Name = "Read" };
public static OperationAuthorizationRequirement Update =
new OperationAuthorizationRequirement { Name = "Update" };
public static OperationAuthorizationRequirement Delete =
new OperationAuthorizationRequirement { Name = "Delete" };
}
Your handler could then be implemented as follows, using a hypothetical Document class as the resource;
你的处理程序然后就能像这样的被执行了,下面的例子用一个假象的Document类:
public class DocumentAuthorizationHandler :
AuthorizationHandler<OperationAuthorizationRequirement, Document>
{
public override Task HandleRequirementAsync(AuthorizationHandlerContext context,
OperationAuthorizationRequirement requirement,
Document resource)
{
// Validate the operation using the resource, the identity and
// the Name property value from the requirement. return Task.CompletedTask;
}
}
You can see the handler works on OperationAuthorizationRequirement. The code inside the handler must take the Name property of the supplied requirement into account when making its evaluations.
你可查看按照OperationAuthorizationRequirement 工作的处理程序。当进行检查时,处理程序中的代码必须将需求提供的Name属性传递到账户中。
To call an operational resource handler you need to specify the operation when calling AuthorizeAsync in your action. For example
为了调用一个操作资源的处理程序,当调用方法中的AuthorizeAsync时,你需要对该项操作进行指定。例如:
if (await authorizationService.AuthorizeAsync(User, document, Operations.Read))
{
return View(document);
}
else
{
return new ChallengeResult();
}
This example checks if the User is able to perform the Read operation for the current document instance. If authorization succeeds the view for the document will be returned. If authorization fails returning ChallengeResult will inform any authentication middleware authorization has failed and the middleware can take the appropriate response, for example returning a 401 or 403 status code, or redirecting the user to a login page for interactive browser clients.
这个例子对User是否可以对当前文档进行Read操作进行检查。如果授权检查成功了,就会返回该文档的视图。如果失败了就返回ChallengeResult ,从而告知认证中间件授权失败,好让中间件采取适当的回应。例如返回401或403状态代码,或者把用户重定向到交互浏览器客户端的登录页面。
public class DocumentController : Controller
{
IAuthorizationService _authorizationService;
public DocumentController(IAuthorizationService authorizationService)
{
_authorizationService = authorizationService;
}
}
Security » Authorization » 基于资源的授权的更多相关文章
- Security » Authorization » 基于视图的授权
View Based Authorization¶ 基于视图的授权 44 of 46 people found this helpful Often a developer will want to ...
- Security » Authorization » 基于声明的授权
Claims-Based Authorization¶ 基于声明的授权 142 of 162 people found this helpful When an identity is created ...
- Security » Authorization » 基于角色的授权
Role based Authorization¶ 基于角色的授权 133 of 153 people found this helpful When an identity is created i ...
- Security » Authorization » 基于自定义策略的授权
Custom Policy-Based Authorization¶ 基于自定义策略的授权 98 of 108 people found this helpful Underneath the cov ...
- 阶段5 3.微服务项目【学成在线】_day16 Spring Security Oauth2_07-SpringSecurityOauth2研究-Oauth2授权码模式-资源服务授权测试
下面要完成 5.6两个步骤 3.3.4 资源服务授权 3.3.4.1 资源服务授权流程 资源服务拥有要访问的受保护资源,客户端携带令牌访问资源服务,如果令牌合法则可成功访问资源服务中的资 源,如下图 ...
- Microsoft.Owin.Security.OAuth搭建OAuth2.0授权服务端
Microsoft.Owin.Security.OAuth搭建OAuth2.0授权服务端 目录 前言 OAuth2.0简介 授权模式 (SimpleSSO示例) 使用Microsoft.Owin.Se ...
- Spring Cloud下基于OAUTH2认证授权的实现
GitHub(spring -boot 2.0.0):https://github.com/bigben0123/uaa-zuul 示例(spring -boot 2.0.0): https://gi ...
- Security » Authorization » 通过映射限制身份
Limiting identity by scheme¶ 通过映射限制身份(这部分有好几个概念还不清楚,翻译的有问题) 36 of 39 people found this helpful In so ...
- ASP.NET MVC 随想录—— 使用ASP.NET Identity实现基于声明的授权,高级篇
在这篇文章中,我将继续ASP.NET Identity 之旅,这也是ASP.NET Identity 三部曲的最后一篇.在本文中,将为大家介绍ASP.NET Identity 的高级功能,它支持声明式 ...
随机推荐
- 利用 Serial Over Lan(SOL)搭建 XEN 的调试信息输出环境
如有转载,请注明出处与本文连接,谢谢! 修改XEN的源码实现额外的功能,需要有一个调试环境来得到XEN的调试信息(有关源码编译并安装 XEN 请阅读我以前的博文:在CentOS下源码安装 Xen并搭建 ...
- Java import以及Java类的搜索路径
如果你希望使用Java包中的类,就必须先使用import语句导入.import语句与C语言中的 #include 有些类似,语法为: import package1[.package2-].cl ...
- C#开发Windows服务 入门
Microsoft Windows 服务(即,以前的 NT 服务)使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序. 服务可以在计算机启动时自动启动,可以暂停和重新启动而且 ...
- Vim命令合集大全
命令历史 以:和/开头的命令都有历史纪录,可以首先键入:或/然后按上下箭头来选择某个历史命令. 启动vim 在命令行窗口中输入以下命令即可 vim 直接启动vim vim filename 打开vim ...
- Qt Creator pro 文件 导入vs2013碰到的问题
显示error LNK1117:sytax error in option... 解决办法 从Properties --> Linker --> Command Line 中删掉Addit ...
- iOS AFNetworking HTTPS 认证
HTTPS 中双向认证SSL 协议的具体过程: 这里总结为详细的步骤: ① 浏览器发送一个连接请求给安全服务器. ② 服务器将自己的证书,以及同证书相关的信息发送给客户浏览器. ③ 客户浏览器检查服务 ...
- hadoop是什么
Hadoop一直是我想学习的技术,正巧最近项目组要做电子商城,我就开始研究Hadoop,虽然最后鉴定Hadoop不适用我们的项目,但是我会继续研究下去,技多不压身. <Hadoop基础教程> ...
- Gradle使用小结
Gradle是CI过程工具,而不是系统.持续集成过程中的构建.自动化测试.打包.发布都可以使用Gradle来完成.而持续进程过程为我们降低各方面成本,提高产品信心,提高产品质量有着非常重要的作用(不要 ...
- Logstash学习-Hello World
1.安装 rpm --import http://packages.elasticsearch.org/GPG-KEY-elasticsearchcat > /etc/yum.repos.d/l ...
- Bootstrap学习(1)
文档顶部写上H5的DOCTYPE声明 head部分: <meta> (1)编码方式 (2)在IE运行最新的渲染模式 <meta http-equiv="x-ua-comp ...