Материализация пользовательского принципала с помощью AspNet.Security.OpenIdConnect.Server (ASP.NET vNext)

Я использую Visual Studio 2015 Enterprise и ASP.NET vNext Beta8 для создания конечной точки, которая одновременно выдает и использует токены JWT, как подробно описано здесь.

Я нахожусь на этапе своего проекта, когда я хочу разрешить аутентификацию носителя JWT, как описано в статье, упомянутой выше, но после аутентификации токена я хочу:

  • Зайдите после успешной аутентификации JWT и проверьте его различные утверждения.
  • Гидратировать экземпляр с заданной областью моего собственного основного объекта (скажем, IContosoPrincipal) на основе того, что я нахожу в токене.
  • Убедитесь, что конкретная поддержка для IContosoPrincipal ограничена текущим запросом.
  • Зависимость внедряет IContosoPrincipal позже в один из моих контроллеров, защищенных токенами.

Я уверен, что это будет включать объект IContosoPrincipal с ограниченной областью действия, и я, вероятно, смогу понять эту часть, но я не уверен, как перехватить аутентификацию JWT после токен успешно аутентифицирован, но до вызова контроллера/действия происходит.

Любые советы о том, как подойти к этому, будут высоко оценены.


person 42vogons    schedule 03.11.2015    source источник


Ответы (1)


Пользовательские участники/удостоверения официально не поддерживаются (и не будут) в ASP.NET 5. Вы можете найти дополнительную информацию по этой теме: https://github.com/aspnet/Security/issues/323.

Вместо этого вам настоятельно рекомендуется хранить необходимые данные в виде отдельных утверждений и при необходимости предоставлять методы расширения вокруг ClaimsIdentity/ClaimsPrincipal (например, если вам нужно отформатировать значение утверждения).

FWIW, этот шаблон активно используется самой ASP.NET Identity 3, которая поставляется со встроенными расширениями (такими как GetUserName или GetUserId), которые вы можете использовать в своем собственном коде:

/// <summary>
/// Returns the User ID claim value if present otherwise returns null.
/// </summary>
/// <param name="principal">The <see cref="ClaimsPrincipal"/> instance this method extends.</param>
/// <returns>The User ID claim value, or null if the claim is not present.</returns>
/// <remarks>The User ID claim is identified by <see cref="ClaimTypes.NameIdentifier"/>.</remarks>
public static string GetUserId(this ClaimsPrincipal principal)
{
    if (principal == null)
    {
        throw new ArgumentNullException(nameof(principal));
    }
    return principal.FindFirstValue(ClaimTypes.NameIdentifier);
}

https://github.com/aspnet/Identity/blob/dev/src/Microsoft.AspNet.Identity/PrincipalExtensions.cs

person Kévin Chalet    schedule 04.11.2015
comment
спасибо за этот очень информативный и подробный ответ. Я бы солгал, если бы сказал, что не был разочарован; ) Итак, позвольте мне задать этот вопрос по-другому - я хочу внедрить зависимость что-то в мой контроллер, который знает идентификатор идентификатора пользователя в моем токене (на самом деле у меня есть аспект, который делает это, но он все еще ДИ). В vNext каков принятый метод для этого. Я копался в исходном коде AspNet.Identity, но их расширения компоновщика сразу же начинают делать что-то с файлами cookie, поэтому не уверен, что это неправильное репо. - person 42vogons; 05.11.2015
comment
Для этого рекомендуется напрямую извлекать принципала из HTTP-запроса (через HttpContext). Если ваш компонент не имеет прямого доступа к контексту HTTP, вы можете внедрить IHttpContextAccessor в качестве зависимости и получить доступ к принципалу через IHttpContextAccessor.HttpContext.User. - person Kévin Chalet; 05.11.2015
comment
просто обратите внимание, что на сегодняшний день URL-адрес PrincipalExtensions не работает. Не уверен, что это AspNetCore фактический, так как содержание отличается - person superjos; 26.07.2016
comment
вроде как обратились к более универсальному хелперу - person superjos; 26.07.2016
comment
@superjos FYI: эти расширения были заменены методами экземпляра в UserManager и SignManager (stackoverflow.com/questions/35693239/). - person Kévin Chalet; 26.07.2016