【问题标题】:Rename profile claim mapping in .net core openid connect configuration在 .net core openid 连接配置中重命名配置文件声明映射
【发布时间】: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");

【问题讨论】:

    标签: .net .net-core openid-connect .net-5


    【解决方案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”
    猜你喜欢
    • 2023-03-28
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    • 2017-07-04
    • 2022-11-11
    • 2010-10-22
    • 2021-10-29
    • 1970-01-01
    相关资源
    最近更新 更多