【问题标题】:How to add custom claims to Jwt Token in OpenIdConnect in .Net Core如何在 .Net Core 的 OpenIdConnect 中向 Jwt Token 添加自定义声明
【发布时间】:2021-07-20 16:19:52
【问题描述】:

就像 AzureAD 一样,我们有自己的自定义公司 ActiveDirectory,我们使用 OpenIdConnect(AddOpenIdConnect 扩展方法)从 UI 和 .NetCore 中的身份验证 API 连接它。 在我在 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 的任何其他方式。

【问题讨论】:

    标签: c# asp.net authentication openid-connect dotnetopenauth


    【解决方案1】:

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

    这些是需要考虑的因素:

    • 了解 AS 是否可以在发行令牌时联系并获取自定义声明,如 this Curity article

    • 注意不要将详细的 JWT 返回给互联网客户端,而是将它们保留在您的后端。不透明令牌可以帮助解决这个问题,如 this other Curity article

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

    【讨论】:

    • 我们的身份验证服务器不支持应用程序声明,我必须调用自定义 AuthAPI 来获取这些声明,但问题是我做了两次,一次在 UI 上,一次在 API 上,因为两者都需要授权, 有没有一种方法可以让我在 UI 上只执行一次并将其传播到 API 层,我无法通过 Bearer 令牌执行此操作,因为令牌验证将在 API 层失败。
    猜你喜欢
    • 2019-11-11
    • 2019-10-01
    • 2021-09-24
    • 2019-02-26
    • 2018-07-05
    • 2017-05-25
    • 1970-01-01
    • 2018-03-04
    • 2019-09-20
    相关资源
    最近更新 更多