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

背景

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

另外一个问题就是在实际编程过程中,我们的代码有不同的模式,不同的分层或者在不同的项目之中,如何在不同的地方取得用户信息,特别是业务系统,根据操作员的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.mzph.cn/pingmian/24090.shtml

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

相关文章

Python画图(多图展示在一个平面)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

字典转化为文字后,如何保存方便下一次引用

背景&#xff1a;需要从列表中获取两列数据&#xff0c;并将其拼接显示在一个对话框内 问题&#xff1a;列表原有的两列数据是以字典的形式呈现的&#xff0c;只在列表中短暂的转化成文字&#xff0c;在其他地方还是字典值&#xff08;数字&#xff09;&#xff0c;所以如何将…

各平台对象存储

一、阿里云对象存储 官方文档&#xff1a;https://help.aliyun.com/zh/oss/getting-started/getting-started-with-oss?spma2c4g.11186623.0.0.299a646c6nWWcW 1.引入maven 官网&#xff1a;https://help.aliyun.com/zh/oss/developer-reference/java-installation?spma2c…

小白学linux | 使用正则表达式审计ssh登录ip地址

Ubuntu /var/log/auth.log记录了所有与身份验证相关的事件&#xff0c;包括SSH登录尝试 grep -i "failed password" /var/log/auth.log | \awk {if($11 ~/^[0-9]\.[0-9]\.[0-9]\.[0-9]$/)print $11 ; else print $13} | \uniq -c | sort -nr -k1 RedHat系发行版 /va…

AI大模型,普通人如何抓到红利?AI+产品经理还有哪些机会

前言 随着人工智能技术的飞速发展&#xff0c;AI大模型正逐渐渗透到我们的工作和生活中&#xff0c;为普通人带来了前所未有的便利和机遇。然而&#xff0c;如何有效地抓住这些红利&#xff0c;让AI大模型为我们所用&#xff0c;成为了许多人关注的焦点。 对于普通人而言&…

java aliyun oss上传和下载工具类

java aliyun oss上传和下载工具类 依赖 <dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.8.0</version></dependency>工具类 import com.alibaba.fastjson.JSON; import c…

Threejs-04、物体的缩放与旋转

1、物体的缩放 因为物体的scale属性是vector对象,因此按照vector的属性和方法,设置x/y/z轴的缩放大小 //例如设置x轴放大3倍、y轴方向放大2倍、z轴方向不变 cube.scale.set(3, 2, 1); //单独设置某个轴的缩放 cube.scale.x = 32、物体设置旋转 因为的旋转通过设置rotation属性…

国自然和毕业论文的流程图用这个格式导入Word可无限放大

AI编辑的图片导出EMF格式可直接插入Word和PPT中 可无限放大 不推荐WMF&#xff0c;导入word可能会发生格式变化 还可在PPT中去除分组再编辑

MIPS极简史:风雨40年,两度IPO六次被收购,读后感

昨天在网上搜了mips&#xff0c;搜到了这篇文章。花时间读完了这篇文章。 mips将重点放在了pc和服务器上&#xff0c;竞争对手是intel和amd&#xff0c;mips没有竞争过这两家公司。整个历程充满坎坷。 这篇文章的两段原文如下&#xff1a; Wave Computing Inc.时运不济&…

ceph radosgw 原有zone placement信息丢失数据恢复

概述 近期遇到一个故障环境&#xff0c;因为某些原因&#xff0c;导致集群原有zone、zonegroup等信息丢失&#xff08;osd&#xff0c;pool等状态均健康&#xff09;。原有桶和数据无法访问&#xff0c;经过一些列fix后修复&#xff0c; 记录过程 恢复realm和pool相关信息 重…

我找到了全网最低价买服务器的 bug !!!

拍断大腿 周五&#xff0c;放松一下&#xff0c;给大家分享下我最近的事儿&#xff0c;以及带大家薅个&#xff08;可能会有&#xff09;的羊毛。 上个月&#xff0c;家里买了 Apple TV&#xff08;可理解为苹果的电视盒子&#xff09;装了 infuse&#xff08;一个在电视盒子上…

宝兰德应用服务器软件通过保险业信息技术应用创新攻关实验室产品适配测试认证

近期&#xff0c;宝兰德中间件核心产品「应用服务器软件 V9.5.5」&#xff08;以下简称&#xff1a;应用服务器软件&#xff09;顺利通过了保险业信息技术应用创新攻关实验室产品适配测试。标志着宝兰德应用服务器软件符合信息技术产品适配要求&#xff0c;能够全面支持金融保险…

读python、pytorch代码时代码函数记录

在读取pytorch训练代码时&#xff0c;作为小白的自己&#xff0c;总是碰到一些没用过的函数和语法&#xff0c;这里记录学习下&#xff1a; os.sep:跨平台路径分隔符,在Python中&#xff0c;os模块提供了一些与操作系统交互的功能&#xff0c;其中os.sep是一个非常重要的属性。…

Python语言字母:深度解析与魅力探索

Python语言字母&#xff1a;深度解析与魅力探索 Python&#xff0c;作为一种广泛使用的编程语言&#xff0c;其字母背后蕴含着丰富的内涵和深厚的魅力。本文将从四个方面、五个方面、六个方面和七个方面&#xff0c;深入剖析Python语言字母所蕴含的秘密和魅力&#xff0c;带您…

解决CentOS 7无法识别ntfs的问题

解决CentOS 7无法识别ntfs的问题 方式一&#xff1a; Centos默认不支持ntfs文件格式&#xff0c;直接在Centos7上插U盘或移动硬盘无法识别&#xff0c;安装 ntfs-3g即可&#xff1a; # yum install epel-release -y # yum install ntfs-3g -y[rootbogon ~]# rpm -qa | grep nt…

系统与软件工程软件测试设计技术

测试设计技术包含基于规格说明书的技术&#xff0c;基于结构的技术&#xff0c;基于经验的技术三大项。 一 基于规格说明书的技术&#xff1a; 1.1 等价类划分 等价类划分使用测试项模型将测试项输入和输出划分为等价类(也称为“分区”)&#xff0c;其中每个等价类都应当作为…

由于找不到 XXX.dll,无法继续执行代码。重新安装程序可能会解决此问题——解决方案

由于找不到 XXX.dll&#xff0c;无法继续执行代码。重新安装程序可能会解决此问题——解决方案 一、问题描述 之前项目都是在Ubuntu操作系统下完成&#xff0c;进行的很顺利。由于我没有Linux物理机&#xff0c;每次都要打开虚拟机感觉挺麻烦的&#xff0c;我就想着把在Linux上…

LaneKeepingEnv(自动驾驶仿真)

LaneKeepingEnv环境的工作原理可以归纳如下&#xff1a; 初始化阶段&#xff1a; 环境在创建时&#xff0c;会调用__init__方法进行初始化。初始化过程中&#xff0c;会设置一些关键的属性&#xff0c;如lane&#xff08;当前车道&#xff09;、lanes&#xff08;所有车道的列…

中国版Wayve决战端到端,等待数据的大力出奇迹

作者 |王博 编辑 |德新 「人工智能的定律只有一个&#xff0c;就是规模定律&#xff08;Scaling Law&#xff09;&#xff0c;大力出奇迹。端到端是描述方式&#xff0c;更应该去考虑如何去生产更多的自动驾驶合适的数据&#xff0c;来喂养更大更合适的模型&#xff0c;取得更…

zeppelin(kylin的可视化界面安装)(从头到尾安装)

zeppelin(kylin的可视化界面安装) 1、zeppelin安装前的准备工作&#xff1a; 1、虚拟机安装配置好jdk&#xff0c; 2、虚拟机安装配置好Hadoop&#xff0c; 3、虚拟机安装配置好Hive 4、虚拟机安装配置了hbase 5、安装了kylin&#xff08;麒麟&#xff09; 6、下载了zeppelin…