0

我们已经使用 Idsrv4 大约 2 年了,我们已经成功地与 .Net Core APIs、.Net Core Apps 集成。现在,我们有一个遗留应用程序,从 Net461 迁移到 .Net Core 的成本很高。

我正在尝试将我们的 .Net 461 MVC 应用程序与 Identity Server 4 集成,我几乎成功地集成了它。但问题是,我不知道如何将非标准声明映射到 MVC 应用程序用户声明。

例如,在我们的声明中,我们有像 Country 和 custom_user_id 这样的特殊参数。如果我检查 JwtAccessToken,我可以看到这些值,并且可以确认声明/范围工作正常。但在 UserClaims 中,它们根本不存在。我只能找到 sub、nbr 等标准声明...

在此处输入图像描述

在 .Net Core 应用程序中,这很简单,我们只需要ClaimActions.MapUniqueJsonKey像下面这样使用:

services.AddOpenIdConnect("oidc", options =>
                {
                    ....

                    options.ClaimActions.MapUniqueJsonKey(JwtClaimTypes.Role, JwtClaimTypes.Role);
                    options.ClaimActions.MapUniqueJsonKey(Constants.CustomClaimTypes.Country, Constants.CustomClaimTypes.Country);
                    options.ClaimActions.MapUniqueJsonKey("custom_user_id", "custom_user_id");
                    options.ClaimActions.MapUniqueJsonKey("custom_company_id", "custom_company_id");

您能否指导我如何强制 OWIN 库从 UserInfoEndpoint 获取数据并将我们的自定义声明映射到 UserClaims?

我正在使用 OWIN 库,我的 OWIN StartUp 类如下所示:

public void Configuration(IAppBuilder app)
        {
            app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

            app.UseCookieAuthentication(new CookieAuthenticationOptions());
            app.UseOpenIdConnectAuthentication(
                new OpenIdConnectAuthenticationOptions
                {
                    ClientId = xxxx,
                    ClientSecret = xxx,
                    Authority = Constants.Urls.IdentityServerProviderUrl,
                    ......
                    Scope = PopulateScopes(), // custom method
                    SignInAsAuthenticationType = CookieAuthenticationDefaults.AuthenticationType,
                    ResponseType = OpenIdConnectResponseType.Code,
                   
                    UseTokenLifetime = false,
                    RedeemCode = true,
                    SaveTokens = true,                    

                    TokenValidationParameters = new TokenValidationParameters()
                    {
                        ValidateIssuer = true                        
                    },
                }
            );                
        }
4

0 回答 0