如何在 ASP.NET Core 3.0 Preview 5 中将声明映射选项传递给 IdentityServerJwt?

2023-12-26

灵感来自关于自定义声明的文章 https://korzh.com/blogs/net-tricks/aspnet-identity-store-user-data-in-claims,我已将租户 ID 自定义声明添加到我的身份服务器登录过程中,如下所示:

using System;
using System.Security.Claims;
using System.Threading.Tasks;
using MyNamespace.Models;
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Options;
using MyNamespace.Data;
using MyNamespace.Constants;

namespace MyNamespace.Factories
{

    public class TenantClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser>
    {
        public TenantClaimsPrincipalFactory(
            UserManager<ApplicationUser> userManager,
            IOptions<IdentityOptions> optionsAccessor)
            : base(userManager, optionsAccessor) {
        }

        // TODO: Remove hard binding to application db context
        protected override async Task<ClaimsIdentity> GenerateClaimsAsync(ApplicationUser user) {
            var identity = await base.GenerateClaimsAsync(user);
            var tenantId = ApplicationDbContext.DefaultTenantId;
            if (user.TenantId != Guid.Empty) {
                tenantId = user.TenantId;
            }
            identity.AddClaim(new Claim(CustomClaimTypes.TenantId, tenantId.ToString()));
            return identity;
        }
    } 

}

声明生成方法在登录时执行,并将声明添加到身份中,因此这部分看起来没问题。后来我尝试在我的租户提供商服务中读出索赔,如下所示

using System;
using MyNamespace.Data;
using Microsoft.AspNetCore.Http;
using System.Security.Claims;
using System.Linq;
using MyNamespace.Constants;

namespace MyNamespace.Services
{

    public interface ITenantProvider
    {
        Guid GetTenantId();
    }

    public class TenantProvider : ITenantProvider
    {
        private IHttpContextAccessor _httpContextAccessor;

        public TenantProvider(IHttpContextAccessor httpContextAccessor
        {
            _httpContextAccessor = httpContextAccessor;
        }

        // TODO: Remove hard binding to application db context
        public Guid GetTenantId()
        {
            var userId = _httpContextAccessor.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value;
            var user = _httpContextAccessor.HttpContext.User;
            var tenantId = _httpContextAccessor.HttpContext.User.FindFirst(CustomClaimTypes.TenantId).Value;    

            Guid tenantGuid = ApplicationDbContext.DefaultTenantId;
            Guid.TryParse(tenantId, out tenantGuid);

            return tenantGuid;
        }
    }

}

然而,据我了解,该声明由CustomClaimTypes.TenantId is 身份服务器不自动映射 https://leastprivilege.com/2017/11/15/missing-claims-in-the-asp-net-core-2-openid-connect-handler/。我的问题是:我怎样才能映射

options.ClaimActions.MapUniqueJsonKey(CustomClaimTypes.TenantId, CustomClaimTypes.TenantId);

from Startup.cs我在其中添加身份服务器我的依赖项:

services.AddAuthentication()
            .AddIdentityServerJwt();

所以,最终我得到了一个与我最初寻求的不同的解决方案。我没有映射工厂创建的声明,而是遇到了StackOverflow 上的另一篇文章 https://stackoverflow.com/questions/44761058/how-to-add-custom-claims-to-access-token-in-identityserver4。基本上,我所做的如下。我实施了以下ProfileService

namespace MyNamespace.Services
{

    public class ProfileService : IProfileService
    {
        protected UserManager<ApplicationUser> _userManager;

        public ProfileService(UserManager<ApplicationUser> userManager)
        {
            _userManager = userManager;
        }

        public async Task GetProfileDataAsync(ProfileDataRequestContext context)
        {
            var user = await _userManager.GetUserAsync(context.Subject);

            var claims = new List<Claim>
            {
                new Claim(CustomClaimTypes.TenantId, user.TenantId.ToString()),
            };

            context.IssuedClaims.AddRange(claims);
        }

        public async Task IsActiveAsync(IsActiveContext context)
        {
            var user = await _userManager.GetUserAsync(context.Subject);

            context.IsActive = (user != null) && user.IsActive;
        }
    }

}

然后,我将服务添加到 DI 容器中:Configure:

services.AddIdentityServer()
                .AddApiAuthorization<ApplicationUser, ApplicationDbContext>()
                .AddProfileService<ProfileService>();

services.AddAuthentication()
                .AddIdentityServerJwt();

所以,我还是很开心地让AddIdentityServerJwt设置 IdentityServer4,同时获取我的声明。

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

如何在 ASP.NET Core 3.0 Preview 5 中将声明映射选项传递给 IdentityServerJwt? 的相关文章

  • 在c#中执行Redis控制台命令

    我需要从 Redis 控制台获取 客户端列表 输出以在我的 C 应用程序中使用 有没有办法使用 ConnectionMultiplexer 执行该命令 或者是否有内置方法可以查找该信息 CLIENT LIST是 服务器 命令 而不是 数据库
  • ComboBox DataBinding 导致 ArgumentException

    我的几个类对象 class Person public string Name get set public string Sex get set public int Age get set public override string
  • IdentityServer 4 对它的工作原理感到困惑

    我阅读和观看了很多有关 Identity Server 4 的内容 但我仍然对它有点困惑 因为似乎有很多移动部件 我现在明白这是一个单独的项目 它处理用户身份验证 我仍然不明白的是用户如何注册它 谁存储用户名 密码 我打算进行此设置 Rea
  • RemoteAuthentication 错误:OpenIdConnectAuthenticationHandler:message.State 为 null 或为空

    RemoteAuthentication 错误 OpenIdConnectAuthenticationHandler message State 为 null 或为空 即使成功获取代码 id token 和 token 后 我将 Razor
  • 如何判断计算机是否已重新启动?

    我曾经使用过一个命令行 SMTP 邮件程序 作为试用版的限制 它允许您在每个 Windows 会话中最多接收 10 封电子邮件 如果您重新启动计算机 您可能还会收到 10 个以上 我认为这种共享软件破坏非常巧妙 我想在我的应用程序中复制它
  • 如何填充 ToolStripComboBox?

    我发现它很难将数据绑定到ToolStripComboBox 好像没有这个ValueMember and DisplayMember特性 怎么绑定呢 访问toolstripcombobox中包装的组合框并访问其ValueMember Disp
  • 从客户端访问 DomainService 中的自定义对象

    我正在使用域服务从 Silverlight 客户端的数据库中获取数据 在DomainService1 cs中 我添加了以下内容 EnableClientAccess public class Product public int produ
  • 在Linux中,找不到框架“.NETFramework,Version=v4.5”的参考程序集

    我已经设置了 Visual studio 来在我的 Ubuntu 机器上编译 C 代码 我将工作区 我的代码加载到 VS 我可以看到以下错误 The reference assemblies for framework NETFramewo
  • 告诉 Nancy 将枚举序列化为字符串

    Nancy 默认情况下在生成 JSON 响应时将枚举序列化为整数 我需要将枚举序列化为字符串 有一种方法可以通过创建来自定义 Nancy 的 JSON 序列化JavaScript 原始转换器 https github com NancyFx
  • ASP Identity CoreGeneratePasswordResetTokenAsync 已过期

    我已经在 NET Core 2 1 中设置了一个 Identity Server 4 项目 一切正常 但是当我使用用户管理器生成重置密码令牌时 令牌在 24 小时后过期 我可以将其更改为 48 小时吗 我发送重置令牌的代码如下所示 var
  • 在mysql连接字符串中添加应用程序名称/程序名称[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在寻找一种解决方案 在连接字符串中添加应用程序名称或程序名称 以便它在 MySQL Workbench 中的 客户端连接 下可见 SQL
  • 保护 APK 中的字符串

    我正在使用 Xamarin 的 Mono for Android 开发一个 Android 应用程序 我目前正在努力使用 Google Play API 添加应用内购买功能 为此 我需要从我的应用程序内向 Google 发送公共许可证密钥
  • WPF DataGridTemplateColumn 组合框更新所有行

    我有这个 XAML 它从 ItemSource 是枚举的组合框中选择一个值 我使用的教程是 http www c sharpcorner com uploadfile dpatra combobox in datagrid in wpf h
  • WebBrowser.Print() 等待完成。 。网

    我在 VB NET 中使用 WebBrowser 控件并调用 Print 方法 我正在使用 PDF 打印机进行打印 当调用 Print 时 它不会立即启动 它会等到完成整个子或块的运行代码 我需要确保我正在打印的文件也完整并继续处理该文件
  • String.Empty 与 "" [重复]

    这个问题在这里已经有答案了 可能的重复 String Empty 和 有什么区别 https stackoverflow com questions 151472 what is the difference between string
  • 我可以在“字节数”设置为零的情况下调用 memcpy() 和 memmove() 吗?

    当我实际上没有什么可以移动 复制的时候 我是否需要处理这些情况memmove memcpy 作为边缘情况 int numberOfBytes if numberOfBytes 0 memmove dest source numberOfBy
  • ListItem 附加自定义值

    我在asp net中使用dropdownlist 它有代表下拉列表项目的ListItem集合 每个ListItem只有两个字段来保存数据 Value和Text字段 但这些还不够 我想保存更多数据对于每个项目 假设附加字段中有 Text1 和
  • 不区分大小写的字符串比较 C++ [重复]

    这个问题在这里已经有答案了 我知道有一些方法可以进行忽略大小写的比较 其中涉及遍历字符串或一个good one https stackoverflow com questions 11635 case insensitive string
  • 使用 IIS 发布:找不到服务器 DNS

    我正在尝试使用 IIS 发布我的项目 我能够通过 Visual Studio 发布它 La aplicaci n web se public correctamente file D www plataformafantasy com Co
  • OpenCV SIFT 描述符关键点半径

    我正在深入研究OpenCV的SIFT描述符提取的实现 https github com Itseez opencv blob master modules nonfree src sift cpp 我发现了一些令人费解的代码来获取兴趣点邻域

随机推荐

  • + 运算符什么时候比 StringBuilder 更快? [复制]

    这个问题在这里已经有答案了 过去 我一直相信你应该使用StringBuilder and append String 当用变量构建字符串时 而不是string split i 在什么情况下这是准确的 我问是因为通常情况下 如果我要写以下内容
  • 直接从无窗口 Linux 终端启动 OpenGL 应用程序

    究竟如何让 OpenGL 应用程序直接从终端 Ubuntu Server 9 04 全屏运行 我在我的服务器上开发了一个用于视觉诊断的应用程序 但是 我不完全确定让它在无窗口环境中运行的最佳方法 理想情况下 我会运行我的程序 visuald
  • 在 TFS 中的解决方案之间共享代码 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我有几个不同的应用程序 我需要在它们之间共享代码以减少维护 我尝试在 stackoverflow 和 web 上阅读大量
  • 提取两个字符串之间不同的字符

    我用过adist计算两个字符串之间不同的字符数 a lt Happy day b lt Tappy Pay adist a b result 2 现在我想提取那些不同的字符 在我的示例中 我想获取字符串 Hd or TP 没关系 我试着看一
  • 通过 Gmail 发送电子邮件时出现错误

    在这里 我尝试使用 gmail 发送邮件 但出现以下错误 javax mail AuthenticationFailedException 534 5 7 14
  • 在 Laravel 4 中显示自定义验证的错误消息

    我通过创建一个类创建了一个自定义错误函数
  • 未定义参数的性能损失

    我经常在函数中使用可选参数 但一些测试显示它们在 Firefox 和 safari 中性能受到巨大影响 70 95 奇怪的是 如果我传入文字值不明确的那么就没有处罚 这里可能发生什么 我不会认为这是一个作用域链问题 因为它们本质上是函数的本
  • 正则表达式也匹配重音字符

    我有以下 PHP 代码 search foo bar que search string str replace search text This is my foo text with qu and other accented char
  • 如何以只读方式打开 Eclipse 项目?

    有谁知道有没有办法在 Eclipse 中以只读模式打开项目 如果打开了很多类似的项目 很容易对错误的项目进行更改 当您从前一个项目创建另一个实例时 将项目置于只读模式非常有用 因此 您复制旧项目中的所有文件 然后在新实例中进行更改 错误地编
  • Primefaces 数据表的列标题中的工具提示

    在基于的应用程序中JSF 2 1 and Primefaces 6 0 我正在尝试向数据表的标题添加工具提示 在我当前的解决方案中 仅当将鼠标精确指向文本标题 Projekttyp 时才会出现工具提示 我需要每当鼠标指针位于列标题中时就显示
  • 使用 jQuery 和 iFrame 下载大文件 - 需要文件就绪事件,以便我可以隐藏加载 gif

    我正在使用 jQuery 下载一些需要一些时间才能创建的文件 因此我显示了一个加载 gif 来告诉用户要有耐心 但问题是 加载 gif 当前显示和隐藏都在一瞬间 有没有办法让我在下载完成后隐藏加载 gif 并且用户在屏幕上弹出 保存文件 窗
  • Vaadin 为版本控制添加什么

    我们正在使用 Vaadin 14 我们应该将项目中的哪些文件夹提交到版本控制 文件夹node modules非常大 非常耗时 我们应该提交这个吗 node modules目录不应该加入版本控制 package json and packag
  • 通过 Facebook 的图 api 发布状态

    在 PHP 中 我尝试使用图形 api 将状态发布到我们的 Facebook 粉丝页面 尽管遵循 facebook 给出的说明 但以下代码似乎没有更新状态 这是代码 xPost access token key xPost message
  • Android:如何通过xml制作看起来像光环的Circle

    我正在尝试使用带有光环的 xml 制作一个圆圈 光环就像从中心的绿色开始 绿色不断褪色 最后在边缘变得透明 该怎么办呢 我正在尝试使用以下内容
  • 如何在限制 ssh 的防火墙后面通过 https 访问 heroku git

    Heroku 部署在我家里就像一个魅力 但我的办公室网络限制 ssh 这会阻止命令 git push heroku master 有没有办法使用 heroku git 存储库的 https url 来推送我的应用程序 您只能通过 ssh 推
  • @IdClass JPA 注解

    这是我的一个实体的复合主键 public class GroupMembershipPK implements Serializable private static final long serialVersionUID 78164338
  • 切片如何包含自身?

    我正在尝试使用 The Go 编程语言 来学习 Golang 并且我已经到达了关于切片的部分 它们在数组和切片之间进行比较 因为两个数组可以与 其中两片不能 正文如下 operator for arrays of strings it ma
  • Mongo 上按日期字符串(升序)排序

    我有一个数据库 其中的日期列格式为 dd mm yyyy 我想按日期升序排序 cursor collection gt find filter gt sort array date gt 1 tripID gt 1 日期是一个字符串 我也在
  • 立即获取整数中最左边活动位的索引[重复]

    这个问题在这里已经有答案了 如何从左到右而不是从右到左扫描整数 二进制 我知道我可以从左边开始尝试每一位 然后记录最左边的位 但是有没有更快的方法 是否有一个内置函数可以立即找到整数中最左边的有效位 即 1 我知道从右到左 我可以做类似的事
  • 如何在 ASP.NET Core 3.0 Preview 5 中将声明映射选项传递给 IdentityServerJwt?

    灵感来自关于自定义声明的文章 https korzh com blogs net tricks aspnet identity store user data in claims 我已将租户 ID 自定义声明添加到我的身份服务器登录过程中