.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.mfbz.cn/a/687567.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ACDSee Photo Studio Ultimate v17 解锁版安装教程 (图片编辑器)

前言 ACDSee Photo Studio Ultimate 2024&#xff0c;一款适合各类摄影师和创意人士的综合解决方案&#xff0c;具备了经过省时的本地人工智能 (AI) 强化的全新特性和改进功能&#xff0c;使您能够以最小的投入获得最大的控制&#xff0c;从而更轻松地管理、检索和编辑您的照片…

免费分享一套SpringBoot+Vue校园论坛(微博)系统【论文+源码+SQL脚本】,帅呆了~~

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue校园论坛(微博)系统&#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue校园论坛(微博)系统 Java毕业设计_哔哩哔哩_bilibili【免费】SpringBootVue校园论坛(微博)系统 Java毕业设计…

Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。

文章目录 前言一、项目初始化搭建1、创建项目&#xff1a;test_models_django2、创建应用app01 二、配置mysql三、创建model实例&#xff0c;自动创建数据库表1、创建对象User类2、执行命令 四、思考问题&#xff08;****&#xff09;1、是否会生成新表呢&#xff08;答案报错&…

数据结构——哈希表、哈希桶

哈希概念 顺序结构以及平衡树中&#xff0c;元素关键码与其存储位置之间没有对应的关系&#xff0c;因此在查找一个元素时&#xff0c;必须要经过关键码的多次比较&#xff0c;顺序查找时间复杂度为O(N),平衡树中为树的高度,即O(logN),搜索的效率取决于搜索过程种元素的比较次…

Java递归删除文件夹

Java可以直接删除文件或者空文件夹&#xff0c;但是当文件夹不为空时&#xff0c;就不能直接删除了&#xff0c;这时候可以使用递归将文件夹直接删除 首先我们假设在D盘创建a文件夹&#xff0c;a中有一个b文件夹&#xff0c;b中有一个c文件夹&#xff0c;c中有三个文本文件&…

22. 计算机网络 - 物理层

通信方式带通调制 通信方式 根据信息在传输线上的传送方向&#xff0c;分为以下三种通信方式&#xff1a; 单工通信&#xff1a;单向传输半双工通信&#xff1a;双向交替传输全双工通信&#xff1a;双向同时传输 带通调制 模拟信号是连续的信号&#xff0c;数字信号是离散的…

新Docker镜像代理地址!

针对近期国内Docker镜像代理地址不能用,新的替换地址&#xff1a; 除了阿里自己账号申请的镜像加速地址外&#xff0c;下面的也可以用 "https://docker.m.daocloud.io", "https://docker.nju.edu.cn", "https://dockerproxy.com" systemctl d…

搭建自己的DNS服务器

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

Unity 资源 之 风格化地形纹理(Stylized Terrain Textures)免费领取

风格化地形纹理&#xff1a;Stylized Terrain Textures 前言资源包内容领取兑换码 前言 亲爱的 Unity 游戏开发者们&#xff0c;我们自豪地为大家推荐最新的每周免费资源&#xff1a;风格化地形纹理&#xff01;这些令人惊叹的纹理将为你的游戏世界带来独特而引人入胜的视觉体…

走进高等学府,ATFX再度亮相雅尔穆克大学,共绘市场发展新蓝图

自2022年成功获得约旦证券委员会&#xff08;JSC&#xff09;颁发牌照后&#xff0c;ATFX植根约旦本土并于同年设立约旦办事处&#xff0c;不断深化与当地各界合作伙伴间的沟通协作&#xff0c;矢志为每一位客户打造优质、便捷、高效的投教服务体验。近日&#xff0c;ATFX再度登…

人工智能系统越来越擅长欺骗我们?

人工智能系统越来越擅长欺骗我们&#xff1f; 一波人工智能系统以他们没有被明确训练过的方式“欺骗”人类&#xff0c;通过为他们的行为提供不真实的解释&#xff0c;或者向人类用户隐瞒真相并误导他们以达到战略目的。 发表在《模式》(Patterns)杂志上的一篇综述论文总结了之…

JustAuth Illegal state xx问题

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

Mat的lambda方式像素高效遍历(C++11)

Mat的lambda方式像素高效遍历&#xff08;C11&#xff09; 文章目录 Mat的lambda方式像素高效遍历&#xff08;C11&#xff09;前言一、Mat的lambda方式像素高效遍历二、代码实现总结 前言 图像遍历是图像处理中的经典操作&#xff0c;快速高效的进行像素遍历对性能的提升至关…

建构信任基石:揭秘Web3的去中心化信任体系

在传统的互联网时代&#xff0c;信任往往建立在中心化的机构和第三方平台之上&#xff0c;而这种中心化的信任体系往往面临着数据泄露、信息滥用等问题。然而&#xff0c;随着区块链技术的发展&#xff0c;Web3时代正在向我们展示一种全新的信任体系&#xff0c;即去中心化的信…

随到随学|2024泰迪智能科技暑期在线项目/集训营

在数字化转型的浪潮中&#xff0c;大数据和人工智能等前沿技术已成为推动经济发展和科技进步的关键动力。当前&#xff0c;全球各行各业都在积极推进数字化转型&#xff0c;不仅为经济增长注入新活力&#xff0c;也对人才市场结构产生了深刻影响&#xff0c;尤其是对数字化人才…

vCenter7.0安装部署

vCenter7.0安装部署 一、准备环境二、创建新的虚拟机1.创建虚拟机2.第3-5步可直接默认安装并同意许可协议。3.其他设置4.第一阶段直接点完成即可 三、进入第二阶段安装&#xff08;输入ip&#xff1a;5480进入安装界面&#xff09; 一、准备环境 准备一台exsi&#xff0c;并登…

《数学学习与研究》投稿难度大吗?

《数学学习与研究》杂志的投稿难度相对适中。 一方面&#xff0c;它作为一本有一定影响力的数学专业期刊&#xff0c;对稿件的质量有一定要求。论文需要具备一定的创新性、科学性和逻辑性&#xff0c;研究内容要具有一定的价值和深度。 另一方面&#xff0c;与一些核心期刊相…

Lab_ Exploiting a mass assignment vulnerability_实验室:利用大规模分配漏洞

使用 wiener:peter 登录 点击轻量级“l33t”皮夹克产品并将其添加到购物篮中。 去到购物车&#xff0c;点击下单&#xff0c;提示Not enough store credit for this purchase&#xff08;没有足够的商店信用用于此次购买&#xff09; 在Burp的HTTP历史记录中发现了API的请求…

QT creator c动态链接库的创建与调用

QT creator c动态链接库的创建与调用 QT5.15.2 1.创建dll项目 确保两类型选择正确 2.选择MinGW 64-bit 3.点击完成 pro文件参考&#xff1a; QT - guiTEMPLATE lib DEFINES QT_DLL_DEMO_LIBRARYCONFIG c17# You can make your code fail to compile if it uses deprecat…

网线制作(双绞线+水晶头)——T568B标准

参考视频&#xff1a;https://www.bilibili.com/video/BV1KQ4y1i7zP/ 1、使用剥线器 2、将线捋顺、排序、剪掉牵引线 记忆技巧 1.线序颜色整体是一浅一深 2.颜色顺序是黄、蓝、绿、棕 一个黄种人、从上向下看&#xff0c;分别看到的是蓝天、青草(绿)、泥土(棕色) 3.中间两根浅…