在 .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 服务一起使用时出错