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

news/2024/9/19 7:28:05/文章来源:https://www.cnblogs.com/vic-tory/p/18326418

什么是授权(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://www.hqwc.cn/news/772232.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CTF-内存取证题目

一:使用volatility2版本 1、分析镜像 python2 vol.py -f /home/kali/桌面/worldskills3.vmem imageinfo 2、从内存中获取到用户admin的密码并且破解密码,以flag{admin,password}形式提交(密码为6位) (1)查看系统用户 python2 vol.py -f /home/kali/桌面/worldskills3.vme…

后端说,单页面SPA和前端路由是怎么回事

没有请求的路由 在传统开发中,浏览器点击一个超链接,就会像后端web服务器发送一个html文档请求,然后页面刷新。但开始单页面开发后,就完全不同了。 单页面?这个概念难以理解。我用一个js作为整个web应用,然后再这个js中操作dom变化,以此来实现页面变化。这不叫单页面吗?…

nginx批量封禁黑名单ip

nginx批量封禁黑名单ip昨天搞到差不多1点,今天又是忙到6点半,连我领导都说“搞得我们加一好憔悴呀”。有很长一段时间没更新博客了,想着怎么做个人IP。。。谋出路一、需求介绍废话少说,需求就是怎么批量封禁别人给来的一大堆黑名单ip。甲方每天不定期发来几百、上千个ip,我…

【基础教程】Tutorial on Pytorch 结合官方基础文档和个人经验

参考与前言 此教程首次书写于2021年12月份 至 2022年4月份间不断补充;阅读本文时可以对着代码运行查看官方网址:https://pytorch.org/tutorials/ 【基本从这里翻译而来 更简洁版+碎碎念】 https://pytorch.org/tutorials/beginner/blitz/cifar10_tutorial.html#sphx-glr-begi…

kettle从入门到精通 第八十一课 ETL之kettle kettle中的json对象字段写入postgresql中的json字段正确姿势

1、上一节可讲解了如何将json数据写入pg数据库表中的json字段,虽然实现了效果,但若客户继续使用表输出步骤则仍然无法解决问题。 正确的的解决方式是设置数据库连接参数stringtype=unspecified 2、stringtype=unspecified 参数的作用: 当设置为 unspecified 时,pg JDBC 驱动…

C++文件系统操作6 - 跨平台实现文件和文件夹的拷贝

1. 关键词 2. fileutil.h 3. fileutil.cpp 4. filesystem_win.h 5. filesystem_win.cpp 6. filesystem_unix.cpp 7. 源码地址1. 关键词 C++ 文件系统操作 拷贝文件 拷贝文件夹 跨平台 2. fileutil.h#pragma once#include <string> #include <cstdio> #include <…

ArchLinux 问题集锦

电脑使用Android的网络 sudo pacman -S usb_modeswitch 手机打开网络共享 Android使用usb连接电脑网络 yay -S gnirehte gnirehtet runAndroid 投屏到电脑 sudo pacman -S scrcpy scrcpyPlasma KDE Screen Locking Picture of the Day 每日一图的图片缓存位置~/.cache/plasma_e…

Manjaro Linux安装

安装分区以及配置方案 manjaro 安装分区以及配置方案 根分区/:看成Windows的C分区,在重装系统时只格式化根分区/ /home分区:要存放用户目录及用户日积月累的数据,要尽量大些 /boot:不使用 UEFI 时,/boot 的建议大小时 200 MB,使用 UEFI 时,需要至少 512 MiB 空间 /var:…

雷达气象学(1)——雷达电磁波的散射

目录1.0 电磁波的特征1.1 散射的概念及类型1.2 散射函数——表示粒子的散射能力1.3 瑞利后向散射函数1.4 后向散射截面——更好地表示粒子的散射能力1.5 反射率因子 1.0 电磁波的特征 雷达的探测方式为电磁波。电磁波是在空间传播的电场和磁场两者结合,它在时空上呈现正弦与余…

雷达气象学(2)——雷达电磁波的衰减

目录2.1 衰减的概念2.2 气体对电磁波的衰减2.3 云对电磁波的衰减2.4 雨对电磁波的衰减2.5 雪对电磁波的衰减2.5.1 干雪对电磁波的衰减2.5.2 湿雪对电磁波的衰减2.6 冰雹对电磁波的衰减参考文献 2.1 衰减的概念 衰减是电磁波能量沿传播路径减弱的现象。造成衰减的原因是当电磁波…

将手机作为服务器运行docker服务

前言 目前手机的配置并不低,即使是2019年生产的一加七Pro,配置也有12+256,CPU是骁龙855,作为服务器运行着配置绰绰有余了,二手的价格现在是400左右也能接受。相对于是自带ups电源的便携低耗docker服务器,还能同时使用安卓系统,配上adb远程做云手机也可以。 要想原生支持…