ASP.NET Core--基于授权的资源
翻译如下:
通常授权取决于正在访问的资源。 例如,文档可以具有作者属性。 将只允许文档作者对其进行更新,因此必须在进行授权评估之前从文档存储库加载资源。 这不能使用Authorize属性来完成,因为属性评估发生在数据绑定之前,以及您自己的代码加载资源之前在一个动作中运行。 而不是声明性授权,属性方法,我们必须使用命令式授权,开发人员在其自己的代码中调用授权函数。
在代码中授权
授权被实现为服务,AuthorizationService,在服务集合中注册并且通过依赖注入可用于控制器访问。
public class DocumentController : Controller
{
IAuthorizationService _authorizationService; public DocumentController(IAuthorizationService authorizationService)
{
_authorizationService = authorizationService;
}
}
IAuthorizationService接口有两种方法,一种是传递资源和策略名称,另一种是传递资源的地方和要求求值的需求列表。
Task<bool> AuthorizeAsync(ClaimsPrincipal user,
object resource,
IEnumerable<IAuthorizationRequirement> requirements);
Task<bool> AuthorizeAsync(ClaimsPrincipal user,
object resource,
string policyName);
要调用服务在您的操作中加载您的资源,然后调用您需要的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();
}
}
编写一个资源处理程序
为基于资源的授权编写处理程序与编写一个简单的需求处理程序没有太大的不同。 您创建一个需求,然后为需求实现一个处理程序,指定前面的需求以及资源类型。 例如,可能接受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;
}
}
不要忘记你还需要在ConfigureServices方法中注册你的处理程序;
services.AddSingleton<IAuthorizationHandler, DocumentAuthorizationHandler>();
操作要求
如果您根据读取,写入,更新和删除等操作进行授权决策,则可以在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" };
}
然后,您的处理程序可以如下实现,使用假设的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;
}
}
您可以看到处理程序在操作授权要求上工作。 处理程序中的代码在进行评估时必须考虑提供的需求的Name属性。
要调用操作资源处理程序,您需要在操作中调用AuthorizeAsync时指定操作。 例如:
if (await authorizationService.AuthorizeAsync(User, document, Operations.Read))
{
return View(document);
}
else
{
return new ChallengeResult();
}
此示例检查用户是否能够对当前文档实例执行读取操作。 如果授权成功,将返回文档的视图。 如果授权失败返回ChallengeResult将通知任何认证中间件授权失败,中间件可以采取适当的响应,例如返回401或403状态码,或将用户重定向到交互式浏览器客户端的登录页面。
ASP.NET Core--基于授权的资源的更多相关文章
- ASP.NET Core 基于JWT的认证(一)
ASP.NET Core 基于JWT的认证(一) Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计 ...
- Asp.Net Core基于JWT认证的数据接口网关Demo
近日,应一位朋友的邀请写了个Asp.Net Core基于JWT认证的数据接口网关Demo.朋友自己开了个公司,接到的一个升级项目,客户要求用Aps.Net Core做数据网关服务且基于JWT认证实现对 ...
- ASP.NET Core基于K8S的微服务电商案例实践--学习笔记
摘要 一个完整的电商项目微服务的实践过程,从选型.业务设计.架构设计到开发过程管理.以及上线运维的完整过程总结与剖析. 讲师介绍 产品需求介绍 纯线上商城 线上线下一体化 跨行业 跨商业模式 从0开始 ...
- ASP.NET Core 基于JWT的认证(二)
ASP.NET Core 基于JWT的认证(二) 上一节我们对 Jwt 的一些基础知识进行了一个简单的介绍,这一节我们将详细的讲解,本次我们将详细的介绍一下 Jwt在 .Net Core 上的实际运用 ...
- 理解ASP.NET Core - 基于JwtBearer的身份认证(Authentication)
注:本文隶属于<理解ASP.NET Core>系列文章,请查看置顶博客或点击此处查看全文目录 在开始之前,如果你还不了解基于Cookie的身份认证,那么建议你先阅读<基于Cookie ...
- asp.net core策略授权
在<asp.net core认证与授权>中讲解了固定和自定义角色授权系统权限,其实我们还可以通过其他方式来授权,比如可以通过角色组,用户名,生日等,但这些主要取决于ClaimTypes,其 ...
- ASP.NET Core MVC 授权的扩展:自定义 Authorize Attribute 和 IApplicationModelProvide
一.概述 ASP.NET Core MVC 提供了基于角色( Role ).声明( Chaim ) 和策略 ( Policy ) 等的授权方式.在实际应用中,可能采用部门( Department , ...
- ASP.NET Core - 基于IHttpContextAccessor实现系统级别身份标识
问题引入: 通过[ASP.NET Core[源码分析篇] - 认证]这篇文章中,我们知道当请求通过认证模块时,会给当前的HttpContext赋予当前用户身份标识,我们在需要授权的控制器中打上[Aut ...
- asp.net core 基于 JSON 实现多语言
asp.net core 基于 JSON 实现多语言 Intro 上次我们提到了,微软默认提供基于资源文件的多语言本地化,个人感觉使用起来不是太方便,没有 json 看起来直观,于是动手造了一个轮子, ...
- 理解ASP.NET Core - 基于Cookie的身份认证(Authentication)
注:本文隶属于<理解ASP.NET Core>系列文章,请查看置顶博客或点击此处查看全文目录 概述 通常,身份认证(Authentication)和授权(Authorization)都会放 ...
随机推荐
- Unity新功能|全息模拟器
http://forum.china.unity3d.com/thread-21539-1-1.html
- Google Material Design的图标字体使用教程
使用教程 1. 打开Material icons下载页 2. 选择要下载的图标 (目前不能多选>_<) 3.选择要下载的格式即可 图标字体使用教程 [方法一] STEP 1: 引入字体文件 ...
- Confluence Wiki -- 页面限制
Confluence Wiki 中 [页面设置] 应该如何理解? 当一个用户有这个权限后,这个用户可以对一个页面做限制,可以限制这个页面不能被其他用户浏览或编辑: 反之,如果没有这个权限,那么这个用户 ...
- down的另一种用法
- 【ASP.NET实战教程】ASP.NET实战教程大集合,各种项目实战集合
[ASP.NET实战教程]ASP.NET实战教程大集合,各种项目实战集合,希望大家可以好好学习教程中,有的比较老了,但是一直很经典!!!!论坛中很多小伙伴说.net没有实战教程学习,所以小编连夜搜集整 ...
- Writing Clean Code 读后感
最近花了一些时间看了这本书,书名是 <Writing Clean Code ── Microsoft Techniques for Developing Bug-free C Programs& ...
- css点滴
1.vertical-align这个属性用于块元素的垂直,居中,行元素用line-height. text-align比如li span时,text-align用于上一句的li的元素时,span才会居 ...
- Jquery自定义插件之$.extend()、$.fn和$.fn.extend()
jquery插件的种类: 1.对象级别的插件开发,即给jQuery对象添加方法,封装对象方法的插件,如:parent().appendTo() 2.一种是类级别的插件开发,即给jQuery添加新的全局 ...
- jquery-抖动图组轮播动画
JQ匀速抖动图组轮播动画 一.HTML+CSS <!DOCTYPE html> <html lang="en" xmlns="http://www.w3 ...
- Android studio下使用SharedSDK
原贴出自:http://bbs.mob.com/thread-5148-1-1.html 首先新建了一个项目用来演示集成ShareSDK 下载好了ShareSDK之后,我们按照下面的步骤使用快 ...