Подтвердить что ты не робот

Альтернатива использованию HttpContext в System.Web для Owin

Аутентификация ASP.NET теперь основана на промежуточном программном обеспечении OWIN, которое может использоваться на любом хосте на базе OWIN. Идентификатор ASP.NET не имеет никакой зависимости от System.Web.

У меня есть фильтр AuthorizeAttribute, где мне нужно получить текущего пользователя и добавить некоторые свойства, которые будут получены позже контроллерами действий.

Проблема в том, что я должен использовать HttpContext, который принадлежит System.Web. Есть ли альтернатива HttpContext для Owin?

public class WebApiAuthorizeAttribute : AuthorizeAttribute 
{
    public override async Task OnAuthorizationAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
    {
        base.OnAuthorization(actionContext);

        Guid userId = new Guid(HttpContext.Current.User.Identity.GetUserId());

        ApplicationUserManager manager = new ApplicationUserManager(new ApplicationUserStore(new ApplicationDbContext())) { PasswordHasher = new CustomPasswordHasher() };
        ApplicationUser user = await manager.FindByIdAsync(userId);

        actionContext.Request.Properties.Add("userId", user.LegacyUserId);
    }
}

Примечание: я нашел этот вопрос, который кажется дублированным, но просит решение, работающее над проектом NancyFx, для которого оно не подходит для меня.

4b9b3361

Ответ 1

Эта статья дает мне решение:

Web API 2 представил новый Класс RequestContext, который содержит свойство Principal. Это - сейчас правильное местоположение для поиска личности вызывающего абонента. Эта заменяет предыдущие механизмы Thread.CurrentPrincipal и/или HttpContext.User. Это также то, что вы бы назначили, если вы написания кода для аутентификации вызывающего абонента в веб-интерфейсе API.

Итак, просто изменив строку:

Guid userId = new Guid(HttpContext.Current.User.Identity.GetUserId());

Guid userId = new Guid(actionContext.RequestContext.Principal.Identity.GetUserId());

теперь ссылка на System.Web больше не нужна.

Ответ 2

Вы можете использовать OwinRequestScopeContext. Что делает именно то, что вы ищете.

Ответ 3

После чтения this. Мне кажется, что расширение AuthorizeAttribute по-прежнему остается. Однако, поскольку HttpContext основан на IIS, мы хотим избежать его использования с этого момента.

Возникает HttpActionContext. Затем мы могли бы использовать

actionContext.Request.GetRequestContext().Principal.Identity

или

actionContext.RequestContext.Principal.Identity

ИЛИ

actionContext.Request.GetOwinContext().Request.User.Identity чтобы добраться до личности. Все три получат один и тот же объект идентификации.

и да, OwinContext также доступен.