【问题标题】:claims not found on client side在客户端未找到索赔
【发布时间】:2021-12-29 19:04:46
【问题描述】:

我已经实现了 IDS4 客户端。这是在 config.cs

中在 IDS4 上注册客户端的代码
new Client
                {
                    ClientId = "HR.WebClient",
                    ClientName = "HR Module Web Client",
                    ClientSecrets = { new Secret("****".Sha256()) },

                    AllowedGrantTypes = GrantTypes.Code,
                    AlwaysSendClientClaims = true,
                    AlwaysIncludeUserClaimsInIdToken = true,

                    // removed some code for brevity

                    AllowOfflineAccess = true,
                    RequireConsent =  false,

                    // removed some code for brevity
                },

这是我用来在客户端应用的 startup.cs 中配置客户端的扩展方法。

public static void AddCustomAuthentication(this IServiceCollection services, IConfiguration Configuration)
        {
            services.AddAuthentication(options =>
            {
                options.DefaultScheme = "Cookies";
                options.DefaultChallengeScheme = "oidc";
            })
            .AddCookie(options =>
            {
                options.Cookie.Name = $"{Configuration["ClientId"]}.Cookie";
            })
            .AddOpenIdConnect("oidc", options => 
            {
                options.Authority = Configuration["IdentityServerUri"];
                options.SignInScheme = "Cookies";

                options.ClientId = Configuration["ClientId"]; 
                options.ClientSecret = Configuration["ClientSecret"]; 
                options.ResponseType = "code";

                options.SaveTokens = true;
                
                // get claims
                options.GetClaimsFromUserInfoEndpoint = true;

                // removed some code for brevity

            });

            var policy = new AuthorizationPolicyBuilder()
            .RequireAuthenticatedUser()
            .Build();
        }

问题

我已经编写了一些服务器端逻辑来添加运行时声明。我还可以在服务器应用程序端看到这些声明。

但我无法在客户端看到任何声明。

我错过了什么?

更新

这是我的 id_token 和 access_token 的示例

.Token.id_token eyJhbGciOiJSUzI1NiIsImtpZCI6IkNGN0U3OUJEMjNENUFEQjdCQkFFNkM2Mzk3NjM0RTBBIiwidHlwIjoiSldUIn0.eyJuYmYiOjE2NDA2NzA0NDUsImV4cCI6MTY0MDY3MDc0NSwiaXNzIjoiaHR0cHM6Ly9sb2NhbGhvc3Q6NTAwMSIsImF1ZCI6IkNvcnBMZW5zZS5IUi5XZWJDbGllbnQiLCJpYXQiOjE2NDA2NzA0NDUsImF0X2hhc2giOiJUWVdkd2lCbEdacHoyQ19FcXBZaXFBIiwic3ViIjoiNDJkNjRkNzQtMDBjMC00MmE5LWI1OWEtNTUyYjcwOGM0NTcxIiwiYXV0aF90aW1lIjoxNjQwNTkwMTQzLCJpZHAiOiJsb2NhbCIsInByZWZlcnJlZF91c2VybmFtZSI6ImlmdGlraGFyIiwibmFtZSI6ImlmdGlraGFyIiwiYW1yIjpbInB3ZCJdfQ.LgS2_-yW9XcMqmZhOhbSdMznpmbUvat_e7mfw8YLajCOjREuECvYlyC2nowlu6Khch2FZyM5RAgqYPHc0db2NBxhLEaqNIwWIa9We32Vdy6wrHPkx1TrGkQymoiXcktkIeaNA1TCMUfSDA1XRbfygfPyFCq9t06CHC4WmVmcdQFavXic_jFCEBV45_qGsuAeqYi0qbStoQd3dWqkhOkBg3aiZjZKycQXTWGb-dBFSIG7xFZx2AhsEYBpTI9NzG3oRbYbJlV-CEuV2umFVdX77zZOdSvvdrRiMzN_XLw8ZWysLG5yAJiIkL-dprKhqTUbtUHw1jkq4VZc-iQUNvsOgw

.Token.access_token eyJhbGciOiJSUzI1NiIsImtpZCI6IkNGN0U3OUJEMjNENUFEQjdCQkFFNkM2Mzk3NjM0RTBBIiwidHlwIjoiYXQrand0In0.eyJuYmYiOjE2NDA2NzA0NDUsImV4cCI6MTY0MDY3NDA0NSwiaXNzIjoiaHR0cHM6Ly9sb2NhbGhvc3Q6NTAwMSIsImF1ZCI6Imh0dHBzOi8vbG9jYWxob3N0OjUwMDEvcmVzb3VyY2VzIiwiY2xpZW50X2lkIjoiQ29ycExlbnNlLkhSLldlYkNsaWVudCIsInN1YiI6IjQyZDY0ZDc0LTAwYzAtNDJhOS1iNTlhLTU1MmI3MDhjNDU3MSIsImF1dGhfdGltZSI6MTY0MDU5MDE0MywiaWRwIjoibG9jYWwiLCJqdGkiOiI5NTdFRURDNkNGQjI1RDRBODQ5QzBCNzVCMkNDQ0NDOSIsInNpZCI6IjQzODhBMzY0OTVFODEzMzczNDJBMDE4OTU4NUQxMDkxIiwiaWF0IjoxNjQwNTkwMTQzLCJzY29wZSI6WyJvcGVuaWQiLCJwcm9maWxlIiwiSHVtYW5SZXNvdXJjZUFwaSIsIm9mZmxpbmVfYWNjZXNzIl0sImFtciI6WyJwd2QiXX0.kOipzf-kUNSviqgoRf8ieZtswAc6eBfMlkvuc44qNaKAzUIr8Bv4J6O0X455ctnh-jJrutvVkUsBu0SS-wBllAS7LUGh2aIhJV9qTgITxKvDchfHrzJnpyI3dGEbmUweC0pqvpzM_KDNKUG-GhafthehEz6V1SYq3DA2XPKevO4xuTAF9R9zl4KtgXVPZQba2A-3GZxOuL2WZhcxYV3Qm3kLQlHHxiriz5vQDIXTIYsmRdh791YDsjHr7lKIG9Vf8b2Mddivs8FFZerJAJzanzzZQ2wa0nJ4DpOQaasbBAf9NCltkUavHp7Q6x0KWPKAh5Nv--mF1A3VZOPjWvn3yg

【问题讨论】:

    标签: asp.net-identity identityserver4


    【解决方案1】:

    默认情况下,只有这些声明从 ID 令牌传播到用户对象:

    options.ClaimActions.MapUniqueJsonKey("sub", "sub");
    options.ClaimActions.MapUniqueJsonKey("name", "name");
    options.ClaimActions.MapUniqueJsonKey("given_name", "given_name");
    options.ClaimActions.MapUniqueJsonKey("family_name", "family_name");
    options.ClaimActions.MapUniqueJsonKey("profile", "profile");
    options.ClaimActions.MapUniqueJsonKey("email", "email");
    

    你可以找到来源here

    要映射其他声明,我们必须使用以下方法手动映射它们:

    options.ClaimActions.MapUniqueJsonKey("website", "website");
    options.ClaimActions.MapUniqueJsonKey("gender", "gender");
    options.ClaimActions.MapUniqueJsonKey("birthdate", "birthdate");
    

    options.ClaimActions.MapAllExcept("iss", "nbf", "exp", "aud", "nonce");
    

    【讨论】:

    • 我在我的 startup.cs options.ClaimActions.MapUniqueJsonKey("permission", "permission"); 中添加了以下行,但我仍然无法看到权限声明正在传播到客户端。但是我可以在服务器端看到它。
    • 你在服务器端看到它是什么意思?您可以发布 ID 的示例副本并访问 JWT 令牌吗?还?你的意思是在客户端还是在 API 中?还是在 JavaScript 中?
    • 如果我检查 IdentityServer 客户端实现上的身份验证 cookie,我可以看到声明中添加了“权限”。 view IDS4 screenshot 如果我检查正在使用 IDS4 进行身份验证的客户端应用程序上的身份验证 cookie,我看不到任何“权限”声明。 view client app screenshot点击here查看token数据
    • 请随意在问题中粘贴示例 id-token(下载无效)。 IDS4 cookie 中的内容在这里没有任何意义,主要重要的是 ID-token 中的实际内容以及通过 UserInfo 端点可用的内容。您在 userinfo 端点中看到权限了吗?
    • 我已经用我的示例 id_token 和 access_token 更新了问题
    【解决方案2】:

    你能检查一下你是否注册了范围。

                new Client
                {
                    ClientId = "service.client",
                    ClientSecrets = { new Secret("secret".Sha256()) },
    
                    AllowedGrantTypes = GrantTypes.ClientCredentials,
                    AllowedScopes = { "api1", "api2.read_only","otherclaims/scopes" }
                }
    

    【讨论】:

    • 是的,范围已正确注册。
    • “HumanResourceApi”是否包含您需要显示的声明,如果没有,您应该添加它们或直接在范围中添加声明,如“openid profile email givenname 等”。
    【解决方案3】:

    感谢Tore 的输入,我能够意识到我的无知。我完全不知道我们可以通过 IProfileService 的实现来扩展 Identity Server。我可以通过实现 ProfileService 在 access_token 中添加自定义声明。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-03
      • 2020-03-27
      • 2015-02-20
      • 2016-03-02
      • 2017-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多