Как заполнить локальную информацию в User.Identity при использовании app.UseIdentityServerBearerTokenAuthentication()

Как я могу заполнить данные из моих локальных пользователей AspNetUsers в объекте User.Identity, чтобы их можно было использовать в ApiControllers?

Я работаю над клиентским приложением ASP.NET, которое использует приложение IdentityServer3 в качестве поставщика аутентификации. Я отправляю токен носителя в заголовке авторизации, который, кажется, работает хорошо. В моем клиентском приложении я использую следующее промежуточное ПО:

    app.UseIdentityServerBearerTokenAuthentication(
        new IdentityServerBearerTokenAuthenticationOptions
        {
            Authority = settingsService.SsoProviderUrl + "/core/"
        }
    );

В настоящее время User.Identity содержит информацию от провайдера OpenId Connect. Большой! Но я хотел бы также включить информацию о локальном пользователе. У меня есть данные в AspNetUsers и AspNetUserLogins для локального представления пользователя (AspNetUserLogins.ProviderKey равен идентификатору подписчика пользователя в OpenId Connect).

Как я могу заполнить данные из моих локальных пользователей AspNetUsers в объекте User.Identity, чтобы их можно было использовать в ApiControllers? Я могу получить данные в порядке, это просто вопрос получения этих данных в User.Identity, который поставил меня в тупик.


person Travis Collins    schedule 11.04.2016    source источник
comment
Вместо того, чтобы пытаться объединить локальную и внешнюю идентичность, почему бы вам не отправить Identity Server по всем необходимым утверждениям с токеном доступа? Есть ли причина, по которой клиент имеет локальную идентичность?   -  person Scott Brady    schedule 12.04.2016
comment
Другая мысль заключается в том, что вы всегда можете выполнить преобразование утверждений в конвейере веб-API.   -  person Brock Allen    schedule 12.04.2016


Ответы (1)


Решение, к которому я пришел, заключалось в создании собственного промежуточного программного обеспечения, которое подключается к конвейеру после UseIdentityServerBearerTokenAuthentiation(). Новое промежуточное ПО просто извлекает данные, которые я хочу добавить, и добавляет утверждения к текущему удостоверению. Пример кода:

app.Use(async (context, next) =>
{
    if (context.Authentication.User.Identity.IsAuthenticated)
    {
        var identity = context.Authentication.User.Identities.First();
        // Access claims
        var idClaim = identity.FindFirst(ClaimTypes.NameIdentifier);
        string subscriberId = idClaim.Value;

        // your custom code to obtain user information from your database
        var dbUser = await userService.FindAsync(new UserLoginInfo("MyProviderName", subscriberId));

        // put your custom user information into the claims for the current identity.
        identity.AddClaim(new Claim("name", dbUser.UserName));
        identity.AddClaim(new Claim("favorite-color", dbUser.FavoriteColor));
        // and so on

    }

    await next.Invoke();
});
person Travis Collins    schedule 14.04.2016