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)都会放 ...
随机推荐
- Oracle基本数据类型
一 字符串类型 字符串数据类型还可以依据存储空间分为固定长度类型(CHAR/NCHAR) 和可变长度类型(VARCHAR2/NVARCHAR2)两种. 所谓固定长度:是指虽然输入的字段值小于该字段的限 ...
- NOIP2009最优贸易[spfa变形|tarjan 缩点 DP]
题目描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个 城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分 为双向通行的道路 ...
- python Requests模块的简要介绍
Requests的安装: pip install Requests Requests的使用: import requests url = "http://www.mzitu.com" ...
- 2016的ChinaJoy沦为ChinaVR?
China Joy已沦为ChinaVR,厂商烧钱参加? 在上海超过40度的高温天下,游戏爱好者们汗流满面地排起长队,拥挤地通过安检进入场馆,但是很快感受到了一丝凉意. ShowGirl少了 " ...
- Linux编译安装源码包的流程
流程: 1. 下载并解压源码包2. 运行:configure3. 编译:make4. 安装:make install 编译时需要注意一个原则:不要在解压的包中直接执行./configure.m ...
- JSX语法简介
React的核心机制之一就是可以在内存中创建虚拟的DOM元素.React利用虚拟DOM来减少对实际DOM的操作从而提升性能. JSX简介 JSX就是Javascript和XML结合的一种格式.Reac ...
- EXT总结例子
//页面按钮点击展开隐藏 { 空格 xtype:'fieldset', title:'<b>高级搜索< ...
- C#系列——记一次业务需求:对象的深拷贝
这篇随笔着实在意料之外,主要是源于上周开发BS的一个业务,需要用到对象的深拷贝.说的直白一点,就是将对象内存分配区和引用完全拷贝一份新的.这种需求以前就遇到过,怎么解决的已经记不清了.这次趁着这个机会 ...
- Gson解析json字符串
// 解析传递过来的json字符串 JsonParser parser = new JsonParser(); JsonObject jsonObj = parser.parse(strJson).g ...
- 解决Centos/Redhat,命令不存在
[root@26 ~]# lsb_release #不存在-bash: lsb_release: command not found [root@26 ~] ...