在哪里为所有 HttpRequest 设置自定义 ClaimsPrincipal

2023-12-01

我正在将旧应用程序移植到 ASP.NET Core,它使用 Windows 身份验证(在 IIS 中配置,分别为 launchsetting.json)。

在开发模式下运行时,我想覆盖身份验证以使用自定义硬编码的 ClaimsPrincipal。

public class Startup
{
   public void Configure(IApplicationBuilder app, IHostingEnvironment env)
   {

       if (env.IsDevelopment())
       {
           app.UseDeveloperExceptionPage();
       }
       app.UseMvc();    
   }
}

我不确定设置身份和服务/中间件配置的正确位置是什么......


有一种编辑现有身份的正确方法,称为声明转换。基本上,我们必须编写一个实现 IClaimsTransformation 接口的自定义类。文档没有提供太多相关信息,但最重要的是——我们需要克隆给定的身份。

简而言之,这个过程是这样的:

  1. 克隆当前用户身份

  2. 添加自定义声明

  3. 返回克隆身份

    public class AddRolesClaimsTransformation : IClaimsTransformation
    {
        private readonly IUserService _userService; public class AddRolesClaimsTransformation : IClaimsTransformation
        {
            private readonly IUserService _userService;
    
            public AddRolesClaimsTransformation(IUserService userService)
    {
    
        _userService = userService;
    }
    
    public async Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
    {
        // Clone current identity
        var clone = principal.Clone();
        var newIdentity = (ClaimsIdentity)clone.Identity;
    
        // Support AD and local accounts
        var nameId = principal.Claims.FirstOrDefault(c => c.Type ==
            ClaimTypes.NameIdentifier || c.Type == ClaimTypes.Name);
        if (nameId == null)
        {
            return principal;
        }
    
        // Get user from database
        var user = await _userService.GetByUserName(nameId.Value);
        if (user == null)
        {
            return principal;
        }
    
        // Add role claims to cloned identity
        foreach (var role in user.Roles)
        {
            var claim = new Claim(newIdentity.RoleClaimType, role.Name);
            newIdentity.AddClaim(claim);
        }
    
        return clone;
    } }
    

最后要做的事情是在 Startup 类的 ConfigureServices() 方法中通过依赖注入注册声明转换。

services.AddScoped<IClaimsTransformation, AddRolesClaimsTransformation>();
enter code here

基于https://gunnarpeipman.com/aspnet-core-adding-claims-to-existing-identity/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在哪里为所有 HttpRequest 设置自定义 ClaimsPrincipal 的相关文章

  • BASIC 中的 C 语言中的 PeekInt、PokeInt、Peek、Poke 等效项

    我想知道该命令的等效项是什么Peek and Poke 基本和其他变体 用 C 语言 类似PeekInt PokeInt 整数 涉及内存条的东西 我知道在 C 语言中有很多方法可以做到这一点 我正在尝试将基本程序移植到 C 语言 这只是使用
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • 如何在android中以编程方式获取设备的IMEI/ESN?

    为了唯一地标识每个设备 我想使用 IMEI 或 CDMA 设备的 ESN 号 如何以编程方式访问它 你想打电话android telephony TelephonyManager getDeviceId 这将返回唯一标识设备的任何字符串 G
  • 当使用值实例化模板类对象时,C++20 概念无法编译

    请参考以下C 20代码 template
  • MySQL 对字符串第一部分的索引

    我正在 MySQL 中查询一个非常大的表 超过 3M 条记录 其中包含category id subcategory id 和邮政编码 数据库中的 zip 可能是也可能不是 10 个字符 目的是获取指定邮政编码的特定半径内的所有目录 子目录
  • Spring 注解 - 注入对象映射

    使用 XML 注释 我使用以下配置注入地图
  • PHP debug_backtrace 在生产代码中获取有关调用方法的信息?

    是否有令人信服的理由不使用debug backtrace仅仅是为了确定调用方法的类 名称和参数列表吗 不用于调试目的 它的函数名称中有 debug 一词 这让我觉得以这种方式使用它有点肮脏 但它符合我需要做的事情 一个可以从许多地方调用的单
  • 嵌入式linux ARM启动地址

    我按照一些文档通过 sdcard 在 ARM 板 例如 Freescale Vybrid tower 上启动嵌入式 Linux 在文档中 有构建 uImage 并将 u boot 写入 sdcard 的步骤 如下所示 sudo dd if
  • LNK2019问题

    我有一个LNK2019尝试在我的项目中使用某些 DLL 时出现问题 Details 我有一个名为 dll1 的 DLL 项目 编译得很好 使用 declspec dllexport 以便导出 dll1 内的类 供 dll2 使用 我有另一个
  • 如何将现有的 React 应用程序(只是一个没有后端的 UI)插入(注入?)到 SilverStripe 页面布局中?

    我的问题是 我一直在阅读 SilverStripe 4 文档 以便找到一种将现有 React 应用程序 只是没有后端的嵌套 React 组件的 UI 插入 SilverStripe 页面布局的方法 这可能吗 如何确保 SilverStrip
  • php 无法在 wampserver 的 html 代码中工作

    事情是这样的 我有一个名为first php 的文件 其中包含以下代码 welcome br 但是 当我执行它时 php 代码不会被解释 短开标签似乎也已打开 我正在使用 wampserver 我错过了什么 您的服务器似乎配置错 误 您的
  • python 数组赋值与标量赋值

    我有一个二维数组A形状的 4 3 和一个一维数组a形状的 4 我想交换前两行A 以及中的前两个元素a 我做了以下事情 A 0 A 1 A 1 A 0 a 0 a 1 a 1 a 0 显然 它适用于a 但失败了A 现在 第二行成为第一行 但第
  • Selenium IDE:将测试脚本包含到新的测试脚本中

    我们谷歌找到解决方案但没有成功 我们如何将已经录制的脚本添加到新脚本中 Selenium Core有一个扩展 include 可以将另一个测试的内容添加到当前测试中 这是 OpenQA wiki 上的页面 http wiki openqa
  • 编写一个终端仿真器,里面有什么?

    这有点关系到这个问题关于 cmd exe 的更好的 shell 终端 gui 界面 在我寻找更好的 shell 终端的过程中 我遇到的唯一有用的东西是Console2 其他替代品不是免费的 而且通常不会比 Console2 提供更多的功能来
  • 我在这个乒乓球游戏中制作了一个边界,但球拍可以穿过它。我该如何阻止呢?

    我在这个乒乓球游戏中做了一个边框 屏幕上的球拍可以越过它 我之前已经在另一段代码中完成了此操作 但现在一切都不同了 我有一个关于如何做到这一点的主要想法 你可能需要一个 if 语句 但我没有一切 您可以删除 pygame load imag
  • 使用模式在 Jasper Reports 中设置货币格式

    我有一个查询从表中返回金额 select bus price from mySchema BusTable 这将返回如下金额 526547 123456 456789 25 12478 35 我在贾斯珀报告中使用了上述金额 但是 我希望报告
  • 快速裁剪视频

    我正在方形 UIView 中录制视频 但是当我导出视频时 视频是全屏 1080x1920 现在我想知道如何将视频从全屏缩小为方形比例 1 1 以下是我设置摄像机的方法 session AVCaptureSession for device
  • 数据匹配算法

    我目前正在开展一个项目 需要实现数据匹配算法 外部系统传递它所知道的有关客户的所有数据 而我设计的系统必须返回匹配的客户 因此 外部系统知道客户的正确 ID 并获取其他数据或可以更新其自己的特定客户数据 传入以下字段 Name Name2
  • 使用 .clone() 复制二维数组仍然引用原始数据

    好的 我知道这个问题之前已经被问过 上一个问题 我还研究了其他一些线程和网站 它们似乎都产生了比答案更多的问题 乔什 布洛赫谈设计 一篇文章讨论 clone 但我仍然无法找到问题的答案 当我克隆二维数组时 values Map mapVal
  • Postgres 连接表的唯一多列索引

    我在 Postgres 中有一个多对多连接表 我想将其索引到 A 提高性能 显然 和 B 强制唯一性 例如 a id b id 1 2 lt okay 1 3 lt okay 2 3 lt okay 1 3 lt not okay same
  • 回显到文件而不带换行符(批量)[重复]

    这个问题在这里已经有答案了 我的生活创造者计划有问题 它只是选择代表某些内容的随机数并将其放在一起 我尝试过组合变量 这是代码 set num 1 SET A a RANDOM 10 32768 1 if a 10 set life num
  • 在哪里为所有 HttpRequest 设置自定义 ClaimsPrincipal

    我正在将旧应用程序移植到 ASP NET Core 它使用 Windows 身份验证 在 IIS 中配置 分别为 launchsetting json 在开发模式下运行时 我想覆盖身份验证以使用自定义硬编码的 ClaimsPrincipal