多租户Asp.net Core网站中基于参数的JWT认证

2023-12-02

我在 .net core 2.1 网站中使用基于 JWT 的身份验证。目前这工作正常。现在,我必须创建一个 API 多租户,并且每个租户都将拥有自己的密钥。租户 ID 将作为参数传递给 API。

        [Authorize]
        [HttpGet("tenant/{id}")]
        public async Task<IActionResult> GetInfo(string id)
        {
        }

每个租户都会签署 JWT 并添加到授权标头。我无法想出一种根据参数更改 IssuerSigningKey 的方法。我尝试了以下操作:

  1. 通过将其设置为[来验证 API 内的 JWTAllowAonymus]。这可行,但我最终编写了所有 JWT 验证代码。

  2. 实施ISecurityTokenValidator

我可以实施ISecurityTokenValidator验证令牌并在启动配置中使用它,如下所示:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options =>
            {
                options.SecurityTokenValidators.Clear();
                options.SecurityTokenValidators.Add(new JWTSecurityTokenValidator());
            });

并实现了我自己的类来验证令牌。

public class JWTSecurityTokenValidator : ISecurityTokenValidator
{
    public ClaimsPrincipal ValidateToken(string securityToken, TokenValidationParameters validationParameters, out SecurityToken validatedToken)
    {
            // Implement the logic
    }
}

但我最终还是做了繁重的工作。另外,我无法访问 ValidateToken 中的参数“tenantId”。

3.Using IssuerSigningKeyResolver: 我可以实现一个委托:

IEnumerable<SecurityKey> IssuerSigningKeyResolver(string token, SecurityToken securityToken, string kid, TokenValidationParameters validationParameters)

同样,我无法访问“tenantId”参数来选择适当的密钥。

有没有优雅的解决方案可供选择IssuerSigningKey基于参数,这样我就不需要编写自己的逻辑来验证 JWT?或者唯一的选择是选择第一个选项?


可以使用DI来传递IHttpContextAccessor实例到你的JWTSecurityTokenValidator并获得值IHttpContextAccessor.HttpContext财产。

从 .Net Core 2.1 开始,您可以使用扩展名进行注册:

services.AddHttpContextAccessor();

然后按照你的习惯JWTSecurityTokenValidator,修改为注入IHttpContextAccessor :

private readonly IHttpContextAccessor _httpContextAccessor;

public JWTSecurityTokenValidator(IHttpContextAccessor httpContextAccessor) {
    _httpContextAccessor = httpContextAccessor;
}

修改注册在Startup.cs :

options.SecurityTokenValidators.Clear();

options.SecurityTokenValidators.Add(new JWTSecurityTokenValidator(services.BuildServiceProvider().GetService<IHttpContextAccessor>()));

所以说在ValidateToken方法,您可以从中读取参数_httpContextAccessor.HttpContext,根据你传递参数的方式,从查询字符串或路径中读取:

public ClaimsPrincipal ValidateToken(string securityToken, TokenValidationParameters validationParameters, out SecurityToken validatedToken)
{
        var xx = _httpContextAccessor.HttpContext.Request;
        ........
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多租户Asp.net Core网站中基于参数的JWT认证 的相关文章

  • 未提供参数时如何指定 C# System.Commandline 行为?

    在我的控制台应用程序中 当未提供控制台参数时 将执行我指定列表 在本例中为参数 3 的任何处理程序 调用该处理程序时 布尔参数设置为 false 但对我来说 根本不调用它更有意义 如何防止这种情况发生并显示帮助文本 using System
  • 注销租约抛出 InvalidOperationException

    我有一个使用插件的应用程序 我在另一个应用程序域中加载插件 我使用 RemoteHandle 类http www pocketsilicon com post Things That Make My Life Hell Part 1 App
  • Directory.Delete 之后 Directory.Exists 有时返回 true ?

    我有非常奇怪的行为 我有 Directory Delete tempFolder true if Directory Exists tempFolder 有时 Directory Exists 返回 true 为什么 可能是资源管理器打开了
  • 确保 StreamReader 不会挂起等待数据

    下面的代码读取从 tcp 客户端流读取的所有内容 并且在下一次迭代中它将仅位于 Read 上 我假设正在等待数据 我如何确保它不会在没有任何内容可供读取时返回 我是否必须设置低超时 并在失败时响应异常 或者有更好的办法吗 TcpClient
  • 在 DataView 的 RowFilter 中选择 DISTINCT

    我试图根据与另一个表的关系缩小 DataView 中的行范围 我使用的 RowFilter 如下 dv new DataView myDS myTable id IN SELECT DISTINCT parentID FROM myOthe
  • 复制 std::function 的成本有多高?

    While std function是可移动的 但在某些情况下不可能或不方便 复制它会受到重大处罚吗 它是否可能取决于捕获变量的大小 如果它是使用 lambda 表达式创建的 它依赖于实现吗 std function通常被实现为值语义 小缓
  • 在 LINQ 中按 Id 连接多表和分组

    我想按categoryId显示列表产品的名称组 这是我的代码 我想要我的视图显示结果 Desktop PC HP Red PC Dell Yellow PC Asus Red SmartPhone Lumia 720 Blue 我的组模型
  • 如何区分用户点击链接和页面自动重定向?

    拥有 C WebBrowser control http msdn microsoft com en us library system windows forms webbrowser aspx在我的 WinForms 应用程序中 并意识
  • 将 Word 文档另存为图像

    我正在使用下面的代码将 Word 文档转换为图像文件 但是图片显得太大 内容不适合 有没有办法渲染图片或将图片保存到合适的尺寸 private void btnConvert Click object sender EventArgs e
  • 标准化 UTF-8 到底是什么?

    The 重症监护室项目 http userguide icu project org transforms normalization 现在也有一个PHP库 http us php net manual en class normalize
  • 我可以使用 moq Mock 来模拟类而不是接口吗?

    正在经历https github com Moq moq4 wiki Quickstart https github com Moq moq4 wiki Quickstart 我看到它 Mock 一个接口 我的遗留代码中有一个没有接口的类
  • DbContext 和 ObjectContext 有什么区别

    From MSDN 表示工作单元和存储库模式的组合 使您能够查询数据库并将更改分组在一起 然后将这些更改作为一个单元写回存储 DbContext在概念上类似于ObjectContext 我虽然DbContext只处理与数据库的连接以及针对数
  • Qt - ubuntu中的串口名称

    我在 Ubuntu 上查找串行端口名称时遇到问题 如您所知 为了在 Windows 上读取串口 我们可以使用以下代码 serial gt setPortName com3 但是当我在 Ubuntu 上编译这段代码时 我无法使用这段代码 se
  • C# HashSet 只读解决方法

    这是示例代码 static class Store private static List
  • 使用 %d 打印 unsigned long long

    为什么我打印以下内容时得到 1 unsigned long long int largestIntegerInC 18446744073709551615LL printf largestIntegerInC d n largestInte
  • 按 Esc 按键关闭 Ajax Modal 弹出窗口

    我已经使用 Ajax 显示了一个面板弹出窗口 我要做的是当用户按 Esc 键时关闭该窗口 这可能吗 如果有人知道这一点或以前做过这一点 请帮助我 Thanks 通过以下链接 您可以通过按退出按钮轻松关闭窗口 http www codepro
  • 调用堆栈中的“外部代码”是什么意思?

    我在 Visual Studio 中调用一个方法 并尝试通过检查调用堆栈来调试它 其中一些行标记为 外部代码 这到底是什么意思 方法来自 dll已被处决 外部代码 意味着该dll没有可用的调试信息 你能做的就是在Call Stack窗口中单
  • 方法优化 - C#

    我开发了一种方法 允许我通过参数传入表 字符串 列数组 字符串 和值数组 对象 然后使用这些参数创建参数化查询 虽然它工作得很好 但代码的长度以及多个 for 循环散发出一种代码味道 特别是我觉得我用来在列和值之间插入逗号的方法可以用不同的
  • 我的班级应该订阅自己的公共活动吗?

    我正在使用 C 3 0 遵循标准事件模式我有 public event EventHandler
  • 使用 .NET Process.Start 运行时挂起进程 - 出了什么问题?

    我在 svn exe 周围编写了一个快速而肮脏的包装器来检索一些内容并对其执行某些操作 但对于某些输入 它偶尔会重复挂起并且无法完成 例如 一个调用是 svn list svn list http myserver 84 svn Docum

随机推荐

  • errno、strerror 和 Linux 系统调用

    我可以用strerror 获取文本表示errno使用 CRT 函数后的值 例如fopen 如果我使用open Linux系统调用代替CRT函数 它还设置errno失败时的价值 申请是否正确strerror 对此errno价值 如果没有 是否
  • 找不到有效的签名身份?

    我已经尝试用 mono 创建一个发行版本已经好几天了 我从我们的 团队代理 那里获得了发行配置文件和发行证书 并分别拖放到 xcode organizer 和 keychain access 上 但是仍然有警告消息显示 在您的钥匙串中找不到
  • Java解压字节数组

    在服务器 C 上 二进制数据使用以下方式压缩ZLib功能 compress2 并将其发送到客户端 Java 在客户端 Java 应使用以下代码片段解压缩数据 public static String unpack byte packedBu
  • SPARQL 中的幂(指数)和其他数学函数支持

    I am trying to write a SPARQL query where I want to filter on the square of something but I am simply unable to figure o
  • 如何使默认 bin 目录在 Eclipse 中可见? [复制]

    这个问题在这里已经有答案了 可能的重复 我该怎么做才能在 eclipse 上显示 bin 文件夹 我知道这是一个searing的重复项this问题 但是该问题中提供的答案对我不起作用或对我没有任何帮助 我正在尝试获取项目的默认输出文件夹 b
  • 更改资源字典中的 SolidColorBrush#Color 失败:属性为只读 [重复]

    这个问题在这里已经有答案了 我有一个SolidColorBrushApp xaml 中的资源如下所示
  • wireshark 如何在同一端口上使用两个 lua 解析器正确解析

    我正在编写lua脚本作为wireshark 1 12 4 插件来剖析我的私有协议 我有两个协议 我为每个协议编写一个lua脚本 两个lua脚本看起来如下 local my pro Proto MyPro My Protocol local
  • 程序从哪里分配内存?

    作为一名 C 和 C 程序员 我使用过malloc and new来分配内存 我只是想知道 操作系统如何分配内存 它是从 RAM 硬盘还是其他地方分配 我可以从硬盘借用内存以防万一吗 它实际上比你想象的要复杂得多 操作系统以 页面 的形式考
  • 如何在recycler视图中访问MainActivity的组件来制作onclick监听器?

    我创建了类似 YouTube 的应用程序 其中包含一个视频视图 顶部 和回收器视图 视频视图下方 我陷入困境 我想在 recyclerview 项目上创建 onclicklistner 并更改视频路径来更改视频 但是如何访问适配器类中的 v
  • PHP 中的 SFTP - 未定义的常量 CURLOPT_PROTOCOLS 和 CURLPROTO_SFTP?

    从我的 php 脚本中 我需要能够通过 sftp 将 csv 文件上传到远程服务器 我遵循了这个问题的公认答案 从 PHP 内部进行 SFTP 这是我的代码的样子
  • 使用公式将 Excel 子集列转换为数组

    我需要将帐号放入一个数组中 该数组在列选择上指示为 1 预期结果是 FD 002 17 FD 004 17 我计划在名称范围中使用它 子集感兴趣的表 我尝试使用 INDEX B2 B6 MATCH 1 A2 A6 1 但这失败了Match不
  • openFileInput() 和/或 openFileOutput() I/O 流默默失败

    我一直在研究 android 平台 研究不同的数据存储方式 现在我正在使用Context方法openFileInput and openFileOutput 正如这两种方法的文档告诉我的那样 我创建了一个名为 default 的文件 这是一
  • 几分钟后服务自动停止

    我正在创建一个服务 当活动处于后台以及整个应用程序被销毁时 该服务应该可以工作 我每隔 1 分钟调用一次服务中的位置坐标 但是 当我尝试这样做时 该服务会在 12 15 分钟后自动关闭 我希望该服务能够无休止地工作 直到并且除非它被用户交互
  • 定制系列化

    我有一些必须序列化的对象 class Displayable string name Sprite icon The icon字段需要自定义序列化 因为Sprites 已经被序列化 在不同的文件中 具有自己的格式 由游戏引擎 我只需要存储一
  • Jquery - 在悬停时添加类

    我想要当鼠标继续运行时lijquery 向元素添加一个类 ul class menu li Menu Item li li Menu Item li li Menu Item li li Menu Item li ul
  • Galaxy Note 5:自动降低密度

    我创建了一个依赖某些屏幕指标来运行的应用程序 它在除 Galaxy Note 5 之外的所有设备上都能正常工作 在 Note 5 上 它报告的屏幕尺寸为 1080x1920 而实际屏幕尺寸为 1440x2560 我还在 logcat 中看到
  • 使用泛型返回文字字符串或来自 Dictionary

    我想这一次我超越了自己 请随意编辑标题 我也想不出一个好的标题 我正在从一个文件中读取内容 然后该文件中将包含一个字符串 因为它就像一个 xml 文件 但文件中将是一个文字值或一个 命令 用于从 workContainer 获取值 so
  • 为什么这个巴特沃斯滤波器在 R 和 Matlab 中呈现不同的结果?

    我试图对 R 中的数据使用 20Hz 低通滤波器 但是当我使用 filtfilt 函数时 该图与 matlab 中的不同 我在 R 中使用以下代码 fc lt 20 fs lt 100 Wn lt pi fc 2 fs testar lt
  • 如何根据滚动位置缩小图像宽度

    我正在寻找基于滚动缩小徽标 到目前为止 我有这样的事情 logoSize function var headerOffset window height 650 var maxScrollDistance 1300 window scrol
  • 多租户Asp.net Core网站中基于参数的JWT认证

    我在 net core 2 1 网站中使用基于 JWT 的身份验证 目前这工作正常 现在 我必须创建一个 API 多租户 并且每个租户都将拥有自己的密钥 租户 ID 将作为参数传递给 API Authorize HttpGet tenant