Asp .Net Core 系列:详解授权以及实现角色、策略、自定义三种授权和自定义响应

什么是授权(Authorization)?

在 ASP.NET Core 中,授权(Authorization)是控制对应用资源的访问的过程。它决定了哪些用户或用户组可以访问特定的资源或执行特定的操作。授权通常与身份验证(Authentication)一起使用,身份验证是验证用户身份的过程,授权与身份验证相互独立, 但是,授权需要一种身份验证机制。 身份验证是确定用户标识的一个过程。 身份验证可为当前用户创建一个或多个标识。

授权类型

  • 简单授权
  • 基于角色的授权
  • 基于策略的授权

简单的授权

配置身份验证中间件

            //鉴权 (核心源码就是AuthenticationMiddleware中间件)app.UseAuthentication();//授权app.UseAuthorization();

使用授权

ASP.NET Core 中的授权通过 [Authorize] 属性及其各种参数控制。 在其最基本的形式中,通过向控制器、操作或 Razor Page 应用 [Authorize]` 属性,可限制为仅允许经过身份验证的用户访问该组件。
要实现默认的授权行为,你可以简单地在需要限制访问的控制器或操作上使用 [Authorize] 属性,而不必指定任何特定的角色或策略。这样,只有经过身份验证的用户才能访问这些资源。

        [Authorize]public IActionResult Info(){return View();}
  • [AllowAnonymous] 绕过授权语句。 如果将 [AllowAnonymous] 和某个 [Authorize] 属性结合使用,系统将忽略 [Authorize] 属性。 例如,如果在控制器级别应用 [AllowAnonymous]
    • 将忽略来自同一控制器上的属性 [Authorize] 或控制器上的操作方法的任何授权要求。
    • 身份验证中间件不会短路,但不需要成功。

授权原理

https://github.com/dotnet/aspnetcore/blob/main/src/Security/Authorization/Core/src/DefaultAuthorizationService.cs

https://github.com/dotnet/aspnetcore/blob/main/src/Security/Authorization/Policy/src/PolicyEvaluator.cs

 static AuthenticateResult DefaultAuthenticateResult(HttpContext context){return (context.User?.Identity?.IsAuthenticated ?? false)? AuthenticateResult.Success(new AuthenticationTicket(context.User, "context.User")): AuthenticateResult.NoResult();}

基于角色的授权

创建标识时,它可能属于一个或多个角色。 例如,Tracy 可能属于 AdminUser 角色,而 Scott 只属于 User 角色。 如何创建和管理这些角色取决于授权过程的后备存储。

配置身份验证中间件

            //鉴权 (核心源码就是AuthenticationMiddleware中间件)app.UseAuthentication();//授权app.UseAuthorization();

使用授权

仅当用户为 adminuser 角色成员时才可访问 Info

       [Authorize(Roles ="admin,user")]public IActionResult Info(){return View();}

基于声明策略的授权

创建标识后,可为其分配一个或多个由受信任方颁发的声明。 声明是一个名称值对,表示使用者是什么,而不是使用者可以做什么。

配置策略

            builder.Services.AddAuthorization(options =>{options.AddPolicy("AdminPolicy", policyBuilder =>{policyBuilder.RequireRole("admin");});});

使用授权

        [Authorize(Policy = "AdminPolicy")]public IActionResult Info(){return View();}

基于自定义策略的授权

在底层,基于角色的授权和基于声明的授权均使用要求、要求处理程序和预配置的策略。 这些构建基块支持代码中的授权评估的表达式。 其结果为一个更丰富、可重用且可测试的授权结构。

配置策略

            builder.Services.AddAuthorization(options =>{options.AddPolicy("PermissionPolicy", policyBuilder =>{policyBuilder.Requirements.Add(new PermissionRequirement());});});

配置授权处理程序

IAuthorizationRequirement 是一项没有方法的标记服务以及用于跟踪授权是否成功的机制。

每个 IAuthorizationHandler 负责检查是否满足要求

    /// <summary>/// IAuthorizationRequirement的接口标识/// </summary>public class PermissionRequirement : IAuthorizationRequirement{}public class PermissionHandler : AuthorizationHandler<PermissionRequirement>{private readonly IHttpContextAccessor _accessor;public PermissionHandler(IHttpContextAccessor accessor){_accessor = accessor;}protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, PermissionRequirement requirement){if (context.User == null || context.User?.Identity?.IsAuthenticated == false){//await _accessor.HttpContext.Response.WriteAsJsonAsync(new { code = 401, message = "请先登录" });context.Fail();}else{var role = context.User.Claims.Where(i => i.Type == ClaimTypes.Role).FirstOrDefault();//查数据库if (role != null && role.Value == "admin"){context.Succeed(requirement);}else{context.Fail();}}await Task.CompletedTask;}}

使用授权

        [Authorize(Policy= "TestPolicy")]public IActionResult Info(){return View();}

自定义响应

应用可以注册 IAuthorizationMiddlewareResultHandler,以自定义 AuthorizationMiddleware 处理授权结果的方式。 应用可将 IAuthorizationMiddlewareResultHandler 用于:

  • 返回自定义的响应。
  • 增强默认质询或禁止响应。
    public class PermissionResultHandler : IAuthorizationMiddlewareResultHandler{public async Task HandleAsync(RequestDelegate next, HttpContext context, AuthorizationPolicy policy, PolicyAuthorizationResult authorizeResult){//var endPoint = context.GetEndpoint();//var controllerActionDescriptor = (ControllerActionDescriptor)endPoint.Metadata//  .ToList().FirstOrDefault(d => d is ControllerActionDescriptor);//var controllerName = controllerActionDescriptor.ControllerName;//var actionName = controllerActionDescriptor.ActionName;if (!context.User.Identity.IsAuthenticated){context.Response.StatusCode = (int)HttpStatusCode.Unauthorized;await context.Response.WriteAsync("{\"data\":{\"succeeded\":false,\"code\":401,\"message\":\"登录已过期,请重新登录\"}}");return;}if (!authorizeResult.Succeeded){await context.Response.WriteAsync("{\"data\":{\"succeeded\":false,\"code\":403,\"message\":\"您没有权限操作\"}}");return;}await next(context);}}

image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3268305.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【Git-驯化】一文搞懂git中rm命令的使用技巧

【Git-驯化】一文搞懂git中rm命令的使用技巧 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免费获取相关内容文档关注&#xff1a;微信公…

JS+H5在线文心AI聊天(第三方接口)

源码在最后面 调用的不是文心官方接口 可以正常聊天 有打字动画 效果图 源代码 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-s…

OpenSSL学习笔记及在项目中的使用

OpenSSL官方命令手册&#xff1a;OpenSSL commands - OpenSSL Documentation 参考教程&#xff1a; 操作&#xff1a;OpenSSL的基本使用教程(一&#xff09;_openssl.exe使用教程-CSDN博客 操作&#xff1a;Linux和Shell回炉复习系列文章总目录 - 骏马金龙 - 博客园 (cnblog…

vscode 调试web后端

1、调试环境配置 一、安装python环境管理器 其中要先在vscode选择对应的python环境&#xff0c;最方便的是按照环境管理器后从中选择。其中在【externsions】里面安装python即可。 如下&#xff1a; 二、编写launch.json文件 其中如下&#xff1a; {// Use IntelliSense …

从丢失到找回:2024年U盘数据恢复软件全攻略

优盘作为我们日常短时间存储分享数据来说非常方便&#xff0c;毕竟小巧便携。但是也正因为他小巧数据很容易丢失&#xff0c;如果有备份还好&#xff0c;没有备份就麻烦了。但是只要掌握U盘数据恢复方法就可以缩小我们的损失。 1.福foxit昕数据恢复工具 一键直达>>http…

【算法题】颜色分类,一文彻底搞会!

目录 一、题目描述 二、解题思路 1、什么是荷兰国旗问题&#xff1f; 2、如何解决荷兰国旗问题&#xff1f; 三、参考答案 一、题目描述 颜色分类 给定一个包含红色、白色和蓝色、共n个元素的数组nums &#xff0c;原地对它们进行排序&#xff0c;使得相同颜色的元素相邻&am…

【电源专题】结合锂电池相关资料和华为手机聊聊锂离子电池使用条件限制

在文章:【电源专题】锂电池的特点和工作原理 中我们讲到了一些关于锂电池种类和特点、工作原理等。但是对于锂离子电池使用条件限制却没有介绍,本文基于手机产商 锂离子电池使用条件-电池性能和应用介绍 | 华为官网 (huawei.com)提供的介绍文档再次深入学习锂离子电池的一些特…

浅析JWT原理及牛客出现过的相关面试题

原文链接&#xff1a;https://kixuan.github.io/posts/f568/ 对jwt总是一知半解&#xff0c;而且项目打算写个关于JWT登录的点&#xff0c;所以总结关于JWT的知识及网上面试考察过的点 参考资料&#xff1a; Cookie、Session、Token、JWT_通俗地讲就是验证当前用户的身份,证明-…

【SpringBoot】2 项目搭建

创建项目 1&#xff09;确实本地 jdk 版本 打开命令行窗口&#xff1a;快捷键 Windows R&#xff0c;输入 CMD&#xff0c;敲回车 执行命令&#xff1a;java -version 2&#xff09;在项目 clone 的位置创建 Spring Boot 项目&#xff0c;使用 Maven 进行依赖管理&#xff…

uniapp通过绝对路径解压zpi中的shpe转化为geojson

uniapp通过绝对路径解压zpi中的shpe转化为geojson async fileResult() {const filepath11 /storage/emulated/0/importData/Export_Output_6.zip;// Base64解码函数function base64ToArrayBuffer(base64) {const binaryString atob(base64.split(,)[1]);const len binaryStr…

【计算机网络】DHCP实验

一&#xff1a;实验目的 1&#xff1a;深入理解DHCP&#xff08;动态主机配置协议&#xff09;的工作原理和数据包交换过程。 2&#xff1a;掌握如何通过命令行释放和重新获取IP地址&#xff0c;并通过抓包软件分析DHCP消息的具体内容。 二&#xff1a;实验仪器设备及软件 硬…

人工智能类——计算机科学与技术

计算机科学与技术是一个非常大的门类。目前计算机科学与技术类招生的专业主要有计算机科学与技术、软件工程、网络工程、信息安全、物联网工程等&#xff0c;后面的几个专业是计算机科学与技术的重要分支&#xff0c;而这个门类的其他分支并没有单列出来一个本科专业&#xff0…

前端江湖:从菜鸟到大侠的修炼手册

在这个数字编织的梦幻世界里&#xff0c;前端&#xff0c;这个听起来就带着几分仙气与神秘感的词汇&#xff0c;实则是每一位互联网探险家手中的魔法杖。它不仅连接着代码的冰冷逻辑与用户的炽热情感&#xff0c;更在无数次的点击与滑动间&#xff0c;绘制出一幅幅绚丽多彩的交…

北京率先建设AI原生城市,力争明年推出百个优秀行业大模型产品

7月26日&#xff0c;《北京市推动“人工智能”行动计划&#xff08;2024-2025年&#xff09;》&#xff08;简称《行动计划》&#xff09;正式向社会发布&#xff0c;新京报记者在北京市发展和改革委员会举行的新闻发布会上获悉&#xff0c;北京将率先建设AI原生城市&#xff0…

凸优化笔记-基本概念

原文 文章目录 最小二乘问题 仿射affine hullaffine dimension 凸集锥集超平面和半空间单纯形整半定锥保凸性的操作透视函数 凸函数的条件1阶判定条件2阶判定条件 Epigraph 外图 m i n i m i z e f 0 ( x ) minimize\ \ \ f_0(x) minimize f0​(x) s u b j e c t t o f i ( …

序列化与反序列化的本质

1. 将对象存储到本地 假如有一个student类&#xff0c;我们定义了好几个对象&#xff0c;想要把这些对象存储下来&#xff0c;该怎么办呢 from typing import List class Student:name: strage: intphones: List[str] s1 Student("xiaoming",10,["huawei&quo…

【机器学习】Python、NumPy和向量化的基础知识以及三者结合的用法和示例

引言 在机器学习中&#xff0c;NumPy是一个非常重要的库&#xff0c;特别是在进行向量化操作时。向量化是一种优化技术&#xff0c;可以显著提高数组计算的效率&#xff0c;特别是在处理大型数据集时。NumPy提供了丰富的数组运算功能&#xff0c;使得向量化操作变得简单高效 文…

2024103读书笔记|《飞花令·柳》——梨花淡白柳深青,柳絮飞时花满城

2024103读书笔记|《飞花令柳》——梨花淡白柳深青&#xff0c;柳絮飞时花满城 《飞花令柳&#xff08;中国文化古典诗词品鉴&#xff09;》素心落雪 编著&#xff0c;飞花令得名于唐代诗人韩翃《寒食》中的名句“春城无处不飞花”&#xff0c;类似于行酒令&#xff0c;是文人们…

DVWA中命令执行漏洞细说

在攻击中&#xff0c;命令注入是比较常见的方式&#xff0c;今天我们细说在软件开发中如何避免命令执行漏洞 我们通过DVWA中不同的安全等级来细说命令执行漏洞 1、先调整DVWA的安全等级为Lower,调整等级在DVWA Security页面调整 2、在Command Injection页面输入127.0.0.1&…

基于飞腾FT2000的嵌入式计算机系统

作为中国嵌入式计算机的领导厂家&#xff0c;是最早进入轨道交通领域的 工业级AFC嵌入式计算机系列产品&#xff0c;充分体现了轨道交通新一代AFC主流新技术的各种特点&#xff0c;为轨道交通AFC系统的升级换代提供了良好的系统平台。 标准化 采用开放式架构的Intel新一代主流…