Identityserver3 - HybridFlow не возвращает область профиля

Я настроил клиент identityserver3 и MVC4, используя этот учебник. Когда я настроил клиент для использования «Неявного» потока, все работает, как и ожидалось, и я возвращаю область «профиля». т. е. я могу найти утверждения first_name и Given_name. Ниже мой код конфигурации.

Конфигурация клиента и пользователя

public static class Users
{
    public static List<InMemoryUser> Get()
    {
        return new List<InMemoryUser>
        {
            new InMemoryUser
            {
                Username = "Bob",Password = "password",Subject = "1",
                Claims = new []
                {
                    new Claim(Constants.ClaimTypes.GivenName,"firstName"),
                    new Claim(Constants.ClaimTypes.FamilyName,"lastName")
                }
            }
        };
    }
}

public static class Clients
{
    public static IEnumerable<Client> Get()
    {
        return new[] 
        {
            new Client
            { 
                ClientId = "MVC",
                ClientName = "MVC Client Name",
                RedirectUris = new List<string>
                {
                    "https://localhost:44302/"
                },
                Flow = Flows.Implicit,
                AllowAccessToAllScopes = true
            }
        };
    }
}

Конфигурация сервера идентификации

public void Configuration(IAppBuilder app)
{
    JwtSecurityTokenHandler.InboundClaimTypeMap = new Dictionary<string, string>();

    app.Map("/identity", appBuilder => {
    appBuilder.UseIdentityServer(new IdentityServer3.Core.Configuration.IdentityServerOptions
    {
        SiteName = "Site Name",
        SigningCertificate = LoadCertificate(),
        RequireSsl = false,
        Factory = new IdentityServer3.Core.Configuration.IdentityServerServiceFactory()
            .UseInMemoryClients(Clients.Get())
            .UseInMemoryUsers(Users.Get())
            .UseInMemoryScopes(StandardScopes.All)
        });
    });

    app.UseCookieAuthentication(new Microsoft.Owin.Security.Cookies.CookieAuthenticationOptions
    {
        AuthenticationType = "Cookies"
    });

    app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
    {
        Authority = "https://localhost:44302/identity",
        ClientId = "MVC",
        RedirectUri = "https://localhost:44302/",
        ResponseType = "id_token",                
        SignInAsAuthenticationType = "Cookies",
        Scope = "openid profile"
    });
}

В моем приложении MVC я защитил действие на домашнем контроллере с именем «Контакт».

[Authorize]
public ActionResult Contact()
{            
    ClaimsPrincipal principal = User as ClaimsPrincipal;
    return View(principal.Claims);
}

И, наконец, простой вид

@model IEnumerable<System.Security.Claims.Claim>
@foreach (var item in Model)
{
    <div>
        <span>@item.Type</span>
        <span>@item.Value</span>
    </div>
}
</div>

Теперь, когда я запускаю это приложение, после нажатия на безопасную ссылку «Контакты» меня перенаправляют на сервер STS, и после предоставления учетных данных я вижу вывод ниже.

Вывод

Обратите внимание, что утверждения given_name и family_name присутствуют в утверждениях, возвращаемых STS.

Проблема:

В тот момент, когда я меняю клиент для поддержки гибридного потока. Я не получаю возврат претензий given_name и family_name

Я внес следующие изменения в свой код.

Конфигурация клиента

 public static IEnumerable<Client> Get()
    {
        return new[] 
        {
            new Client
            { 
                ClientId = "MVC",
                ClientName = "MVC Client Name",
                RedirectUris = new List<string>
                {
                    "https://localhost:44302/"
                },
                Flow = Flows.Hybrid,//Changed this to Hybrid
                AllowAccessToAllScopes = true
            }
        };
    }

Конфигурация сервера

app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
        {
            Authority = "https://localhost:44302/identity",
            ClientId = "MVC",
            RedirectUri = "https://localhost:44302/",
            ResponseType = "code id_token token",  //Changed response type              
            SignInAsAuthenticationType = "Cookies",
            Scope = "openid profile"
        });

После запуска приложения я вижу ниже претензии, возвращенные STS.

введите здесь описание изображения

Обратите внимание, что утверждения given_name и family_name на этот раз отсутствуют.

Я ничего не пропустил?


person user2243747    schedule 21.09.2016    source источник
comment
У меня та же проблема, что и с гибридным потоком. Как вы это решили.   -  person barteloma    schedule 22.11.2016


Ответы (1)


Когда вы запрашиваете только id_token, все претензии для пользователя находятся в id_token. Когда вы изменяете свой запрос на получение токена (путем запроса кода или токена), в id_token включаются только утверждения пользователя, настроенные как «AlwaysInclude». Остальные должны быть получены из конечной точки информации о пользователе с использованием полученного вами access_token. Вы можете использовать вспомогательные API в библиотеке IdentityModel, чтобы легко получить доступ к конечной точке сведений о пользователе. В наших примерах показано, как это сделать: https://github.com/IdentityServer/IdentityServer3.Samples/blob/master/source/Clients/MVC%20OWIN%20Client%20(Hybrid)/Startup.cs#L66

person Brock Allen    schedule 21.09.2016
comment
Привет @Брок Аллен, спасибо. Просто из любопытства я добавил настраиваемую область с именем «testScope», и для ее свойства Claims установлено значение List‹ScopeClaim› { new ScopeClaim(IdentityServer3.Core.Constants.ClaimTypes.GivenName,alwaysInclude: true) } Тем не менее я не могу видеть ' заданное_имя' в моем примере. В OpenIdConnectAuthenticationOptions я установил значение ResponseType в 'code id_token', так как гибридному потоку нужны эти параметры. - person user2243747; 22.09.2016
comment
Я изменил тип области действия на «Идентификация», и я мог видеть GivenName в заявке. Теперь нужно понять разницу между ScopeType.Resource и ScopeType.Identity. - person user2243747; 22.09.2016