在 .net core openid 连接配置中重命名配置文件声明映射

Posted

技术标签:

【中文标题】在 .net core openid 连接配置中重命名配置文件声明映射【英文标题】:Rename profile claim mapping in .net core openid connect configuration 【发布时间】:2021-11-01 04:48:58 【问题描述】:

我在配置文件范围内发回了多个声明。这些声明包括:

员工类型 邮件 给定名称

这些 accessToken 声明会自动映射到相同的名称。我希望将它们更改为更改映射如下:

employeeType = EmployeeType

邮件 = 邮件

givenName = 名字

我尝试使用 MapJsonKey(),但它不起作用我也尝试了 MapUniqueJsonKey()。我认为这些可能只用于 userInfoClaims?

    options.ClaimActions.MapJsonKey("EmployeeType", "employeeType");
    options.ClaimActions.MapJsonKey("FirstName", "givenName");
    options.ClaimActions.MapJsonKey("Email", "Mail");

有没有办法将这些映射到不同的名称,还是我必须删除声明并使用 OnTokenValidated 挂钩将它们添加到 Prinical?

这是我在启动时的身份验证配置。

            services.AddAuthentication(options => 
                options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
                )
                .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, o =>
                
                    o.Cookie.Name = "GCOWebCookie";
                    o.AccessDeniedPath = "/AccessDenied";
                )
                .AddOpenIdConnect(OpenIdConnectDefaults.AuthenticationScheme, options => 
                    options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                    options.Authority = config["OneId:Authority"];
                    options.ClientId = config["OneId:ClientId"];
                    options.ResponseType = "code";
                    options.ClientSecret = config["OneId:ClientSecret"];
                    options.SaveTokens = true;
                    //options.GetClaimsFromUserInfoEndpoint = true;
                    options.UsePkce = true;
                    //options.Scope.Add("profile"); These scopees are added by default
                    //options.Scope.Add("openid");

【问题讨论】:

【参考方案1】:

我会尝试改用这种方法:

options.ClaimActions.MapUniqueJsonKey("EmployeeType", "employeeType");

您在问题中的上述内容只会映射 ID-token 的声明并将它们转换为 User 对象。 AddOpenIdConnect 不对访问令牌的内容做任何事情。它从不查看访问令牌内部。

但是,AddJwtBearer 仅侦听访问令牌,当您在 AddJwtBearer 中进行映射时,访问令牌中的声明将被映射到用户对象。您在接收访问令牌的后端 API 中使用的 AddJwtBearer。

要进一步自定义声明,您可以像 question 中所示那样挂钩 OnTicketReceived 事件:

【讨论】:

谢谢托雷。如果您在上面阅读过,我已经尝试过 MapUniqueJsonKey 和 MapJsonKey 但声明仍显示为一个 id 声明名称。这些声明带有配置文件范围,它们不是新范围,也不是从 userinfo 端点获取的。我想我会使用 ClaimAction 删除声明并添加 onTokenValidated。我希望有一个更清洁的解决方案。 你能多发一些你的创业课程吗? 我已经添加了大部分身份验证配置。我还有一个 OnTokenValidated 钩子可以从我的应用程序的数据库中获取更多声明,但这应该是不相关的。不知道这有什么帮助。我只是想知道 .net 核心如何映射来自 accessToken 而不是 userInfo 的声明以及如何更新该映射。 是的,对不起,我可能说错了。我指的是 idToken 而不是 accessToken。 idToken 返回以下声明:employeeType givenName、LastName、mail 所有这些声明都映射到声明主体并添加到 cookie,它们显示在 User 对象中。我只想更改他们的“名称/CLaimTypes”

以上是关于在 .net core openid 连接配置中重命名配置文件声明映射的主要内容,如果未能解决你的问题,请参考以下文章

在不中断授权流程的情况下替换 OpenIdConnectOptions 配置中的发现文档端点 (OpenID Connect .Net Core 3.1)

防止在 asp.net core 2.2 中重定向到 /Account/Login

OpenID Connect 与 ASP NET Core 3.1 没有众所周知的 URL

将 OpenID Connect 与 .NET Core 3.0 ASP.NET Core API 服务一起使用时出错

.Net Core 2 OpenID Connect 身份验证和多个身份

.Net Core OpenID Connect 使用第三方提供商