在哪里为所有 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 的相关文章

随机推荐

  • 如何在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