Как установить oidc ResponseType, чтобы получать и утверждения, и access_token? - PullRequest
1 голос
/ 12 марта 2019

Недавно я работаю над SSO с IdentityServer4, когда я отлаживал код, я обнаружил, что настройка ResponseType вызывает непростую проблему.Когда я устанавливаю «Мой клиент» следующим образом:

JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
        services.AddAuthentication(options =>
        {
            options.DefaultScheme = "Cookies";
            options.DefaultChallengeScheme = "oidc";
        })
            .AddCookie("Cookies")
            .AddOpenIdConnect("oidc", options =>
            {
                options.SignInScheme = "Cookies";
                options.Authority = Configuration["Auth:IdentityServer"];
                options.RequireHttpsMetadata = false;

                options.ClientId = Configuration["Auth:ClientId"];
                options.ClientSecret = Configuration["Auth:ClientSecret"];
                options.ResponseType = "id_token";
                options.SaveTokens = true;
                //options.Scope.Add("8e6144b5-87f6-4638-bf08-1a64599a8b39");
                options.Scope.Add("offline_access");
                options.GetClaimsFromUserInfoEndpoint = true;
            });

, я могу получить такие утверждения (с полным списком требований): enter image description here Но когда я изменяю responseType, как этот options.ResponseType = "id_token token";Претензии такие (только несколько выданных претензий):

enter image description here

Если при входе в систему я хочу получить полный список претензий и токен доступа, чтоя должен сделать, чтобы получить их обоих?

Ответы [ 2 ]

1 голос
/ 13 марта 2019

По умолчанию IdentityServer не будет предоставлять заявки пользователей в токене идентификации, если вместе с ним запрашивается токен доступа. Вы можете увидеть это в исходном коде здесь . Чтобы убедиться, что идентификационный токен всегда содержит утверждения пользователя (независимо от того, запрашивается ли у него токен доступа), установите на своем клиенте AlwaysIncludeUserClaimsInIdToken в true.

0 голосов
/ 12 марта 2019

Я вижу, что вы пытаетесь использовать один из примеров из документации. Поправьте меня если я ошибаюсь.

Если нет, то измените ваш поток на Гибрид (что означает ResponseType = "code id_token token"). Сделайте это на стороне сервера идентификации тоже. К областям применения добавьте также openid и profile. И затем, где вы перечисляете свои претензии, вы можете использовать (при условии, что вы используете страницу бритвы для их перечисления):

@foreach (var claim in ((System.Security.Claims.ClaimsPrincipal)User).Claims)
{
    <li>@claim.Type : @claim.Value</li>
}

Это должно перечислить все ваши претензии (включая сам access_token).

...