我在配置文件范围中发回了多个声明。这些声明包括:
employeeType mail givenName
这些accessToken声明将自动Map到相同的名称。我希望将它们更改为以下Map:
EmployeeType = EmployeeType
mail =邮件
givenName =名字
我尝试使用MapJsonKey(),但它不工作,我还尝试了MapUniqueJsonKey()。我认为这些可能只用于userInfoClaims?
options.ClaimActions.MapJsonKey("EmployeeType", "employeeType");
options.ClaimActions.MapJsonKey("FirstName", "givenName");
options.ClaimActions.MapJsonKey("Email", "Mail");
有没有办法将这些Map到不同的名称,或者我必须删除声明并使用OnTokenValidated钩子将它们添加到Princical?
这是我在启动时的身份验证配置。
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条答案
按热度按时间mwg9r5ms1#
我会尝试使用这个方法:
上面你在问题中,只会MapID令牌的声明并将其转换为User对象。AddOpenIdConnect不会对访问令牌的内容做任何事情。它从不查看访问令牌内部。
然而,AddJwtBearer只监听访问令牌,当你在AddJwtBearer内部进行Map时,访问令牌中的声明将被Map到用户对象。AddJwtBearer你在后端API中使用,用于接收访问令牌。
要进一步自定义声明,您可以挂钩到OnTicketReceived事件,如question所示:
为了补充这个答案,我写了一篇博客文章,更详细地介绍了这个主题:Debugging OpenID Connect claim problems in ASP.NET Core