繁体   English   中英

如何在 OpenIdConnect in.Net Core 中向 Jwt 令牌添加自定义声明

[英]How to add custom claims to Jwt Token in OpenIdConnect in .Net Core

就像 AzureAD 一样,我们有自己的自定义公司 ActiveDirectory,我们从 UI 连接以及 API 使用 OpenIdConnect(AddOpenIdConnect 扩展方法)在.NetCore 中进行身份验证。 在我在 UI 端进行身份验证后的用例中,我需要来自我添加“OnTokenValidated”的自定义数据库中的其他应用程序特定声明 - 这是基于角色和声明隐藏或公开 UI 元素所必需的。

OnTokenValidated = async ctx =>
            {
                //Get user's immutable object id from claims that came from Azure AD
                string oid = ctx.Principal.FindFirstValue("http://schemas.microsoft.com/identity/claims/objectidentifier");

                //Get EF context
                var db = ctx.HttpContext.RequestServices.GetRequiredService<AuthorizationDbContext>();

                //Check is user a super admin
                bool isSuperAdmin = await db.SuperAdmins.AnyAsync(a => a.ObjectId == oid);
                if (isSuperAdmin)
                {
                    //Add claim if they are
                    var claims = new List<Claim>
                    {
                        new Claim(ClaimTypes.Role, "superadmin")
                    };
                    var appIdentity = new ClaimsIdentity(claims);

                    ctx.Principal.AddIdentity(appIdentity);
                }
            }

现在在 API 端再次进行令牌验证后,我必须调用自定义数据库来获取应用程序特定的角色。 是否可以将这些角色包含在 JWT 令牌本身中,所以在 API 方面,所有角色和声明(AD + Custom DB)都存在。 或者我不必在 API 中再次调用 CustomDB 的任何其他方式。

添加自定义声明以访问令牌是授权服务器 (AS) 的一项功能,并不是所有的都支持这一点——尽管它们应该支持这一点,因为它是一个重要的特性。 如果您能准确说出您使用的是哪个提供商,我可能会告诉您这是否可能。

这些是需要考虑的因素:

  • 了解 AS 是否可以在令牌发行时联系并获取自定义声明,如Curity 文章中所述。

  • 请注意不要将详细的 JWT 返回给 Internet 客户端,而是将它们保留在您的后端。 不透明令牌可以帮助解决这个问题,就像在其他 Curity 文章中一样

  • 如果您的提供商无法自定义声明,那么您可以在首次收到访问令牌时在 API 中查找它们,然后将声明缓存在 memory 中。 这会导致更复杂的 API 代码,但对于某些提供商来说是必需的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM