ASP.NET Core认证授权方案

前言

在前面我讲过基于token的权限认证,然后前几天有小伙伴私信我,怎么做一个身份认证也就是授权。

在Asp.net Core常见的授权方式有:

  • 基于角色的授权,

  • 有基于声明的授权,

  • 有基于策略的授权, 这三种授权我就不做过多介绍了,大家可以去查阅官网, https://docs.microsoft.com/en-us/aspnet/core/security/authorization/claims?view=aspnetcore-6.0

自定义授权

今天给大家带来的是自定义授权!

那大家需要了解一下什么是授权,授权就是确定用户身份的过程,其本质就是拥有某些特性的用户会有权限访问某个资源或执行某个操作

那根据这个原理我们可以就可以开始设计了,我们在设计前我们要明白我们所做的系统 都有什么角色,比如我们现在设计一个基于管理员和普通用户的授权。

我们首先肯定要定义一个权限策略,

public class PermissionRequirement : IAuthorizationRequirement{public string _permissionName { get; }public PermissionRequirement(string PermissionName){_permissionName = PermissionName;}}

然后我们将 自定义要求添加到策略在startup类中添加。此外,还需要在 IAuthorizationHandler 类型的范围内向 DI 系统注册新的处理程序:

public void ConfigureServices(IServiceCollection services){services.AddControllers(o =>{//  o.Filters.Add<ApiAuthorize>();o.Filters.Add<MyAuthentication>();});services.AddAuthentication();//基于自定义策略授权services.AddAuthorization(options =>{options.AddPolicy("Admin",policy => policy.Requirements.Add(new PermissionRequirement("Admin")));options.AddPolicy("Client",policy => policy.Requirements.Add(new PermissionRequirement("Client")));});services.AddHttpContextAccessor();services.AddScoped<IAuthorizationHandler, PermissionRequirementHandler>();}

我们注册好了之后肯定要把自定义策略用在控制器上 比如说这个 我们只允许管理员访问。

[HttpGet("GetUserInformation")][Authorize(Policy = "Admin")]public IActionResult GetUserInformation(){return Ok(new { Name="123",Age=18,Sex="性别"});}

那么问题来了 我们怎么去处理这些策略啦,

在Asp.net Core中已经帮我们内置了授权处理的基类AuthorizationHandler,只需要继承他即可, 在Asp.net Core中的授权处理基类是获取不到我们的HTTPContext,所以我们需要借助注入IHttpContextAccessor拿到我们的HTTPContext的上下文

然后在我们的StartUp类里面  注入即可

services.AddHttpContextAccessor();

那我们再看授权处理类

public class PermissionRequirementHandler : AuthorizationHandler<PermissionRequirement>{private readonly IHttpContextAccessor _httpContextAccessor;public PermissionRequirementHandler(IHttpContextAccessor httpContextAccessor){_httpContextAccessor = httpContextAccessor;}protected async override  Task HandleRequirementAsync(AuthorizationHandlerContext context, PermissionRequirement requirement){HttpContext httpContext = _httpContextAccessor.HttpContext;}

那根据我们定义的PermissionRequirement权限策略可以获取到调用的方法具有什么策略。

那我们怎么获取当前用户具有那些角色呢?

所以我们需要改造一下我们获取token的接口 我们在获取Token的时候,把token值写入缓存时,我们把缓存当作我们的key值,用户信息当成Value值 我们定义一个用户信息Model,我这里偷懒了 只需要用户的Code和sub

public class TokenModel{public string UserCode { get; set; }public string Sub { get; set; }}[HttpGet("GetToken")][MyNoAuthentication]public IActionResult GetToken(string UserCode){string token=  AESEncrypt.Encrypt(UserCode);TokenModel tokenModel = new TokenModel();tokenModel.UserCode = UserCode;tokenModel.Sub = UserCode=="1"?"Admin":"Client";MemoryCacheHelper.AddMemoryCache(token, tokenModel);return Ok(token);}

然后再获取Token的时候将值写入到缓存中,最后就像我们判断用户token有效没有来判断用户是否具有权限访问

public class PermissionRequirementHandler : AuthorizationHandler<PermissionRequirement>{private readonly IHttpContextAccessor _httpContextAccessor;public PermissionRequirementHandler(IHttpContextAccessor httpContextAccessor){_httpContextAccessor = httpContextAccessor;}protected async override  Task HandleRequirementAsync(AuthorizationHandlerContext context, PermissionRequirement requirement){HttpContext httpContext = _httpContextAccessor.HttpContext;var authorize = httpContext.Request.Headers["MyAuthentication"];if (string.IsNullOrEmpty(authorize)){await httpContext.Response.WriteAsync("请求参数不能为空");context.Fail();}if (!MemoryCacheHelper.Exists(authorize)){await httpContext.Response.WriteAsync("无效的授权信息或者授权信息已过期"); context.Fail();}TokenModel tokenModel= (TokenModel)MemoryCacheHelper.Get(authorize);if (tokenModel.Sub == requirement._permissionName){context.Succeed(requirement);}else {await httpContext.Response.WriteAsync("服务端拒绝访问:当前身份没有权限访问,请联系管理员开放权限");context.Fail();}}}

测试

我们测试一下

普通用户

547568c7720881b68b10dc3f689afe4c.png

29769bddc6218f80b9e092359e28d8af.png

管理员

aba52a43217171ad8c3a016f98dff27b.png

593680ba14ec1741ac7394d0b421925f.png

3baa4394c670706e21a95e236e2f5e5f.png

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

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

相关文章

插入排序—直接插入排序(Straight Insertion Sort)

基本思想: 将一个记录插入到已排序好的有序表中&#xff0c;从而得到一个新&#xff0c;记录数增1的有序表。即&#xff1a;先将序列的第1个记录看成是一个有序的子序列&#xff0c;然后从第2个记录逐个进行插插入到已入&#xff0c;直至整个序列有序为止。 要点&#xff1a;设…

SQL UNION 和 UNION ALL 操作符(mysql)

首先看两个表&#xff1a; table1: table2: 如果我们要查询table1表和 table2表中的 name1的值&#xff0c;但是不存在重复的值一起输出出来&#xff0c;那么就可以用union操作符&#xff1a; SELECT name1 FROM table1 UNION SELECT name1 FROM table2 结果我们会查…

redis php方案,Redis三种部署方案图文详解

standaloan(单机模式)standaloan 是redis单机模式&#xff0c;及所有服务连接一台redis服务&#xff0c;该模式不适用生产。如果发生宕机&#xff0c;内存爆炸&#xff0c;就可能导致所有连接改redis的服务发生缓存失效引起雪崩。(推荐&#xff1a;redis视频教程)ssentinel(哨兵…

抛开flash,自己开发实现C++ RTMP直播流播放器

众所周知&#xff0c;RTMP是以flash为客户端播放器的直播协议&#xff0c;主要应用在B/S形式的场景中。本人研究并用C开发实现了RTMP直播流协议的播放器&#xff0c;结合之前做的RTMP直播采集端&#xff0c;可以将RTMP协议完全扩展到C/S形式的应用场景中&#xff0c;这将对之后…

.NET 程序读取当前目录避坑指南

前些天有 AgileConfig 的用户反映&#xff0c;如果把 AgileConfig 部署成 Windows 服务程序会启动失败。我看了一下日志&#xff0c;发现根目录被定位到了 C:\Windows\System32 下&#xff0c;那么读取 appsettings.json 配置文件自然就失败了。var builder new Configuration…

Liststring[] 如何去重

List<string[]> 如何去重&#xff0c;代码如下: static void Main(string[] args){List<string[]> list new List<string[]>();list.Add(new string[] { "1", "2", "3" });list.Add(new string[] { "1" });list.Ad…

前端大屏模板分享-可在线浏览

1. 前言站长以前介绍过这个开源项目&#xff0c;最近又有人在问&#xff0c;索性挂在Dotnet9网站上&#xff0c;方便大家在线浏览&#xff0c;先声明&#xff0c;模板来自下面的仓库&#xff1a;仓库名&#xff1a;大屏数据展示模板作者&#xff1a;lvyeyou开源协议&#xff1a…

音视频基本概念和FFmpeg的简单入门

写在前面最近正好有音视频编辑的需求&#xff0c;虽然之前粗略的了解过FFmpeg不过肯定是不够用的&#xff0c;借此重新学习下&#xff1b;基本概念容器/文件(Conainer/File)&#xff1a;即特定格式的多媒体文件&#xff0c;一般来说一个视频文件是由视频&#xff0c;音频&#…

Windows Live Writer 的昨日荣光

今天这一篇文章&#xff0c;想写一写Windows Live Writer这款博客编辑器&#xff08;最早的一个版本是2007年发布的&#xff09;。毫不夸张地说&#xff0c;这是为数不多的几款所见即所得的编辑器之一&#xff0c;当然&#xff0c;它的运行速度慢也是一个众所周知的问题。作为一…

猎豹MFC--CMenu菜单 设置主菜单 给主对话框设置菜单 设置快捷菜单

设置主菜单&#xff08;不是快捷菜单&#xff09;&#xff1a;给主对话框设置菜单&#xff1a;效果如下&#xff1a;修改菜单的ID使之便于记忆&#xff1a;给菜单添加消息处理&#xff1a;添加处理代码&#xff1a;设置快捷菜单&#xff1a;打开对话框&#xff0c;属性添加消息…

领域事件和集成事件没那么高大上

前言随着系统架构的演变&#xff0c;有很多名词也随之涌现&#xff0c;如&#xff1a;微服务、灰度发布、资源隔离、容器、领域/集成事件等&#xff0c;听着的确高大上&#xff0c;让很多小伙伴有一种无法征服的感觉&#xff1b;其实很多东西可能之前就已经用过了&#xff0c;只…

20142335郝昊第三周学习总结

20145335郝昊 《Java程序设计》第3周学习总结 教材学习内容总结 第四章 类与对象 定义&#xff1a; 对象&#xff08;Object&#xff09;&#xff1a;存在的具体实体&#xff0c;具有明确的状态和行为。 类&#xff08;Class&#xff09;:具有相同属性和行为的一组对象的集合&…

hierarchyviewer

为什么80%的码农都做不了架构师&#xff1f;>>> 学习monkeyrunner&#xff0c;无奈怎么都无法启动activity&#xff0c;人家告诉我.hierarchyviewer这个工具可以&#xff0c;今天我就开始学习这个了&#xff0c;但愿有所帮助啊。http://www.xuebuyuan.com/2104811.…

linux之如何查看哪些进程在使用某一个so

1 问题 在我们服务端&#xff0c;我们怎么查看哪些进程在使用某一个so 2 解决办法 lsof **.so 很明显&#xff0c;我们的apache的httpd几个进程在使用这个so

“威胁情报”在手,反黑客终于有地图了!

安全是一场攻防战&#xff0c;那么&#xff0c;如今这样的攻防战发展到了什么level了呢&#xff1f;日前&#xff0c;安全领域的大神们进行了一场闭门研讨 。大神们表示&#xff0c;如今要想保证自己的安全&#xff0c;你不仅需要武器&#xff0c;还需要侦察兵&#xff0c;需要…

winform插入时间类型数据到oracle数据库,winform操作访问Oracle 10g数据库,并自动填充到DataGridView...

使用oracle的ODP.NET是官方推荐&#xff0c;而且相对简单的方法。官方指导文档&#xff1a;http://www.oracle.com/technetwork/cn/testcontent/o23odp-084525-zhs.htmlapp.configForm1.aspx.csusing System;using System.Collections.Generic;using System.ComponentModel;usi…

print的describe的展示全部数据_大数据项目中的QA需要迎接新的挑战

根据IDC全球半年度大数据和分析支出指南的最新预测&#xff0c;到2022年全球大数据和业务分析解决方案的收入将达到2600亿美元。在大数据和业务分析解决方案上投资增长最快的行业包括银行&#xff08;复合年增长率13.3%&#xff09;、医疗、保险、证券和投资服务、电信&#xf…

Enum枚举类型实战总结,保证有用!

一般在我们开发时如果能使用枚举罗列的&#xff0c;一般都会定义一个枚举类型。将枚举类型作为方法的参数&#xff0c;可以方便的进行调用&#xff0c;给我们带来不少的便利&#xff0c;当然有时候它还不如直接用一个int类型带来&#xff0c;带来一定灵活性。但只要能满足业务咱…

linux c之通过popen执行shell命令

1 popen介绍 我是在ubuntu上面进行man popen的,解释如下 这个函数通过创建一个管道通过fork一个进程,然后执行一个command,因为在管道中,所以数据流是单向的,然后type一般只能是读“r”或者写“w”,返回值在IO流里面,用了popen之后我们要记得用pclose函数。 2 使用 #inc…

用java调用.net的wcf其实还是很简单的

前些天和我们的一个邮件服务商对接&#xff0c;双方需要进行一些通讯&#xff0c;对方是java团队&#xff0c;而作为.net团队的我们&#xff0c;只能公布出去的是一个wcf的basicbinding&#xff0c;想不 到问题来了&#xff0c;对方不知道怎么去调用这个basic&#xff0c;可能他…