tutorial systemweb net microsoft framework espaƱol configurar asp c# asp.net asp.net-identity owin katana

c# - systemweb - login identity asp net



Alternativa a usar HttpContext en System.Web para Owin (3)

Después de leer this . Me parece que extender AuthorizeAttribute sigue siendo el camino a seguir. Sin embargo, dado que HttpContext está basado en IIS, queremos evitar usarlo a partir de ahora.

Hay un HttpActionContext que se ha pasado. Entonces podríamos usar

actionContext.Request.GetRequestContext().Principal.Identity

o

actionContext.RequestContext.Principal.Identity

O

actionContext.Request.GetOwinContext().Request.User.Identity para obtener la identidad. Los tres te darán el mismo objeto de identidad.

y sí, OwinContext también está disponible de esta manera.

La autenticación ASP.NET ahora se basa en el middleware OWIN que se puede usar en cualquier host basado en OWIN. La identidad de ASP.NET no tiene ninguna dependencia en System.Web .

Tengo un filtro AuthorizeAttribute donde necesito obtener el usuario actual y agregar algunas propiedades para que sean recuperadas posteriormente por los controladores de acción.

El problema es que tengo que usar el HttpContext que pertenece a System.Web. ¿Hay alguna alternativa de HttpContext para 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); } }

Nota: Encontré esta pregunta , que parece un duplicado, pero solicita una solución que funcione para el proyecto NancyFx, que no es válida para mí.



Este artículo me da la solución:

Web API 2 introdujo una nueva clase RequestContext que contiene una propiedad Principal. Esta es ahora la ubicación adecuada para buscar la identidad de la persona que llama. Esto reemplaza los mecanismos anteriores de Thread.CurrentPrincipal y / o HttpContext.User. Esto también es lo que asignaría si está escribiendo código para autenticar a la persona que llama en la API web.

Tan solo modificando la línea:

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

por

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

ahora, la referencia a System.Web ya no es necesaria.