.net 下的身份认证与授权的实现

news2024/10/6 4:05:57

背景

任何一个系统,都需要对于底层访问的页面和接口进行安全的处理,其中核心就是认证和授权。

另外一个问题就是在实际编程过程中,我们的代码有不同的模式,不同的分层或者在不同的项目之中,如何在不同的地方取得用户信息,特别是业务系统,根据操作员的id来处理不同的业务权限逻辑,这是很多业务应用所关心的。

微软在不同的版本都有各自的实现,现在以>= .net6的版本为准。

基本概念

这里所说的基本概念,是微软框架下的技术概念,对于一些通识的概念,比如以下内容,假定对这些都是熟悉的,

还有对于基本的微软技术概念,也假定大家都是熟悉的,比如 管道,特别是httpcontext的属性

.net 授权

.net 提供了简单授权、基于角色的授权、基于策略的授权,多样的授权方式在通过简单的Attribute修饰就能满足大部分应用场景。授权中重要的两个Attribute就是AuthorizeAttribute和AllowAnonymousAttribute,所有的授权配置都离不开这两个Attribute。同时,.net 对授权方案的扩展也非常方便,在本节的最后会介绍如何自定义授权处理程序来实现自定义授权逻辑。授权有这三种类型简单授权:只要登录就能访问,在Controller或者Action上加个[Authorize]就行基于角色的授权:特定角色能访问基于策略的授权:顾名思义基于角色的授权.

app.UseAuthentication()

  1. services.AddAuthentication(options =>) 如果需要个性化,可以在这里展开,一些规则,比如 DefaultAuthenticateScheme DefaultChallengeScheme
  2. AddJwtBearer Token个性化验证参数
  3. AuthenticationService, AuthenticationHandlerProvider, AuthenticationSchemeProvider 是的,是通过这三个服务,核心是 AuthenticationMiddleware 逻辑都在这里面
  4. Scheme 就是用什么标准规定认证,比如用jwt,bearer, 不同的scheme,就有不同的options,就有不同的handler

所以核心就是使用或者重载这些内容

httpcontext.user

  1. publicabstract System.Security.Claims.ClaimsPrincipal User 这是标准定义

身份认证通过后,身份认证处理程序会返回身份认证票根,即AuthenticationTicket。

AuthenticationTicket是ASP.NET Core封装认证信息的类。

AuthenticationTicket又包含了ClaimsPrincipal,ClaimsPrincipal可以理解为用户主体,由一组ClaimIdentity组成。

ClaimsIdentity可以理解为身份证明,一个用户主体可以有多个身份证明,就好比身份证、驾驶证都可以代表唯一具体的人一样。

ClaimsIdentity包含了一组Claim,Claim就是好比身份证上的姓名、性别、籍贯等信息。一个用户通过身份认证后,就会用以上类来组织用户信息。后续的授权等其他中间件就可以使用这些信息来进行功能设计。

结构示例如下:

  • AuthenticationTicket (身份认证票根,其中封装了认证信息)
    • ClaimsPrincipal (用户主体)
      • ClaimIdentity (身份证明)
        • Claim
        • Claim
        • Claim
      • ClaimIdentity
      • ClaimIdentity

IHttpContextAccessor

我们知道当请求通过认证模块时,会给当前的HttpContext赋予当前用户身份标识,我们在需要授权的控制器中打上[Authorize]授权标签,就可以在ControllerBase的User属性获取到基于声明的权限标识(ClaimsPrincipal)。

  遗憾的是这只是针对Controller层面,很多场景下我们是需要在Service层乃至数据层获直接使用用户信息,这种情况我们就使用不了User了。

解决办法就是通过这个接口来注入一个服务,在业务层面来拉取用户相关信息。可以在登录的时候把userid写进来,另外就是通过token为key,使用redis存放用户信息。

实现基本思路

使用微软安全框架

  1. 使用微软数据库一套
  2. builder.Services.AddIdentity<ApplicationUser, ApplicationRole> 构建自己个性化身份 public partial class ApplicationUser : IdentityUser

namespace Microsoft.AspNetCore.Identity;

/// <summary>

/// The default implementation of <see cref="IdentityUser{TKey}"/> which uses a string as a primary key.

/// </summary>

public class IdentityUser : IdentityUser<string>

  1. public abstract class AuthenticationStateProvider ApplicationAuthenticationStateProvider 自己实现微软的认证,builder.Services.AddScoped<AuthenticationStateProvider, ApplicationAuthenticationStateProvider>();

基于类库个性化认证和授权

清楚了逻辑,后面就是体力活了,不过有一坨的工作要做,需要用户表,应用表,角色表等等

  1. Services.ConfigureOptions<ConfigureJwtBearerOptions>();

Services.ConfigureOptions<ValidateIdentityTokenOptions>();

var authBuilder = Services

.AddAuthentication(MultiScheme)

.AddPolicyScheme(MultiScheme, MultiScheme, options =>

{

options.ForwardDefaultSelector = context =>

{

return context.Request.Headers.Authorization.Any(x => x!.Contains(ApiKeyDefaults.AuthenticationScheme))

? ApiKeyDefaults.AuthenticationScheme

: JwtBearerDefaults.AuthenticationScheme;

};

})

.AddJwtBearer();

_configureApiKeyAuthorization(authBuilder);

Services.AddSingleton<IAuthorizationHandler, yourhandler>();

Services.AddSingleton<IAuthorizationHandler, yourhandler>();

Services.AddSingleton(ApiKeyProviderType);

Services.AddSingleton<IApiKeyProvider>(sp => (IApiKeyProvider)sp.GetRequiredService(ApiKeyProviderType));

Services.AddAuthorization(options => options.AddPolicy(IdentityPolicyNames.SecurityRoot, policy => policy.AddRequirements(new ())));

这是最终都要有的,围绕这些内容展开。

整个项目挺多,就不展开细节了,代码是.net 7 .net8 环境下跑的。

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

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

相关文章

运维监控领域你不得不知道的黑话-下篇

作者&#xff1a;Tshb 引言 书接上回&#xff1a;《运维监控领域你不得不知道的黑话-中篇》。 在上一讲中&#xff0c;我们对监控系统中的四种指标类型进行了详细的阐述。不同类型的指标可以提供不同维度的系统信息&#xff0c;通过对比不同类型的指标&#xff0c;可以让我们…

5. MySQL 运算符和函数

文章目录 【 1. 算术运算符 】【 2. 逻辑运算符 】2.1 逻辑非 (NOT 或者 !)2.2 逻辑与运算符 (AND 或者 &&)2.3 逻辑或 (OR 或者 ||)2.4 异或运算 (XOR) 【 3. 比较运算符 】3.1 等于 3.2 安全等于运算符 <>3.3 不等于运算符 (<> 或者 !)3.4 小于等于运算符…

GAN网络理论和实验(一)

文章目录 一、说明二、摘要三、对架构的介绍四、相关工作五、理论推演5.1 p g p d a t a p_g p_{data} pg​pdata​的全局最优性5.2 算法1的收敛性 六、实验 一、说明 对发布于2014年的关于GAN的原始描述&#xff0c;我们精读此文&#xff0c;对原始的GAN网络概念进行追溯&…

保姆级教程:以SAR图像目标检测为例

一、项目出发点 AI Studio为我们提供了免费的GPU资源&#xff0c;当我们在NoteBook环境中把代码调试成功后&#xff0c;通常一个训练任务耗时较长&#xff0c;而Notebook离线运行有时长限制&#xff0c;一不小心就容易被kill掉。 如何解决这一问题&#xff1f; 后台任务帮到…

1782java英语陪学记词系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java英语陪学记词系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助采用了java设计&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统采用web模式&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&…

鸿蒙嵌入式设备开发之hello world

1. 环境搭建 目前鸿蒙设备的开发环境&#xff0c;可以分为2个部分&#xff1a;Windows调试环境&#xff0c;和Linux编译环境。 其中&#xff0c; Linux环境负责编译代码&#xff0c;并生成鸿蒙的包。Windows环境负责连接设备&#xff0c;进行烧录和调试。 特别注意&#xf…

draw.io 如何设置图形圆角?

draw.io 如何设置图形圆角呢&#xff1f; draw.io 是一款强大的&#xff0c;免费的开源工具&#xff0c;我经常用它来画流程图&#xff0c;但是我发现 draw.io 对于图形圆角的设置&#xff0c;只提供了一个设置选项&#xff0c;如下图&#xff1a; 当你选中某个图形&#xff0…

JustAuth Illegal state xx问题

排查 起因 服务上线生产环境后使用飞书登录有些时候会登录失败,查看日志出现以上错误Illegal state [FEISHU],但是测试环境没有出现这个情况 排查 经过排查发现是JustAuth 报的错 分析出现原因 在JustAuth找到出现原因和解决方案 原文地址:异常相关问题 | JustAuth 异常…

用大模型实现PPT可视化几种思路

https://zhuanlan.zhihu.com/p/700685802 背景 前面一篇文章已经介绍了如何根据用户输入&#xff0c;用大模型实现内容检索、分析、脑图可视化的链路。然而往往投研团队需要针对重要新闻做组内分析解读&#xff0c;需要用ppt的方式来展现&#xff1b;那么优美可能让大模型直…

【全开源】Java同城服务同城信息同城任务发布平台小程序APP公众号源码

&#x1f4e2; 连接你我&#xff0c;让任务触手可及 &#x1f31f; 引言 在快节奏的现代生活中&#xff0c;我们时常需要寻找一些便捷的方式来处理生活中的琐事。同城任务发布平台系统应运而生&#xff0c;它为我们提供了一个高效、便捷的平台&#xff0c;让我们能够轻松发布…

【最新鸿蒙应用开发】——沙箱机制是什么?作用?场景?

沙箱机制 1. 什么是沙箱机制&#xff1f; 1.1. 概念 在操作系统当中&#xff0c;沙箱机制&#xff08;Sandboxing&#xff09;是一种安全机制&#xff0c;用于限制程序代码的访问权限&#xff0c;防止恶意软件对系统造成破坏。在沙箱环境中&#xff0c;程序只能访问特定的资…

Docker 学习总结(83)—— 配置文件daemon.json介绍及优化建议

一、daemon.json 文件概述 daemon.json是Docker守护进程的配置文件,它允许系统管理员自定义Docker守护程序的行为。此文件通常位于/etc/docker/目录下。通过修改daemon.json,可以调整Docker守护进程的多种设置,包括网络配置、日志记录、存储驱动等。 二、daemon.json 文件结…

YoloV8改进策略:Block篇|MobileNetV4——移动生态系统的通用模型

文章目录 摘要1、引言2、相关工作3、硬件无关的帕累托效率4、通用反向瓶颈5、Mobile MQA6、MNv4模型设计6.1、精炼NAS以增强架构6.2、MNv4模型的优化 7、结果7.1、ImageNet分类 8、增强蒸馏方案9、结论10、致谢A、搜索空间细节B、基准测试方法论C、ImageNet-1k分类任务的训练设…

Linux之线程及线程安全详解

前言&#xff1a;在操作系统中&#xff0c;进程是资源分配的基本单位&#xff0c;那么线程是什么呢&#xff1f;线程是调度的基本单位&#xff0c;我们该怎么理解呢&#xff1f; 目录 一&#xff0c;线程概念理解 二&#xff0c;Linux里面的线程原理 三&#xff0c;为什么要…

哈夫曼树的构造,哈夫曼树的存在意义--求哈夫曼编码

一:哈夫曼树的构造 ①权值,带权路径长度。 ②一组确定权值的叶子节点可以构造多个不同的二叉树,但是带权路径长度min的是哈夫曼树 ③算法基本思想及其实操图片演示 注:存储结构和伪代码 1 初始化: 构造2n-1棵只有一个根节点的二叉树,parent=rchild=lchild=-1; 其中…

忆恒创源国产系列新品 —— PBlaze7 7A40 取得 PCI-SIG 兼容性认证

在此前报道中&#xff0c;我们曾预告了忆恒创源国产系列 PCIe 5.0 SSD 新品 —— PBlaze7 7A40&#xff0c;今天&#xff0c;这款 SSD 已经顺利通过 PCI-SIG 的严格测试并出现在 Integrators List 集成商列表当中&#xff0c;标志着距离 PBlaze7 7A40 的正式发布又近了一步。 正…

Spring Boot框架基础

文章目录 1 Spring Boot概述2 Spring Boot入门2.1 项目搭建2.2 入门程序 3 数据请求与响应3.1 数据请求3.2 数据响应 4 分层解耦4.1 三层架构4.2 控制反转4.3 依赖注入 5 参考资料 1 Spring Boot概述 Spring是Java EE编程领域的一个轻量级开源框架&#xff0c;是为了解决企业级…

乐高小人分类项目

数据来源 LEGO Minifigures | Kaggle 建立文件目录 BASE_DIR lego/star-wars-images/ names [YODA, LUKE SKYWALKER, R2-D2, MACE WINDU, GENERAL GRIEVOUS ] tf.random.set_seed(1)# Read information about dataset if not os.path.isdir(BASE_DIR train/):for name in …

Edge 工作区是什么?它都有哪些作用?

什么是工作区 Edge 工作区是什么&#xff1f;它是微软 Edge 浏览器中的一个功能&#xff0c;在帮助用户更好地组织和管理他们的浏览会话。通过工作区&#xff0c;用户可以创建多个独立的浏览环境&#xff0c;每个工作区内包含一组相关的标签页和浏览器设置。这使得用户能够根据…

asp.net core使用httpclient

主要讲解常见的get请求和post请求 GET var client new HttpClient(); //3秒钟不响应就超时 client.TimeoutTimeSpan.FromSeconds(3); using HttpResponseMessage response await client.GetAsync("todos/3"); var jsonResponse await response.Content.ReadAsSt…