L'authentification ASP.NET est désormais basée sur le middleware OWIN qui peut être utilisé sur n'importe quel hôte OWIN. L'identité ASP.NET ne dépend pas de System.Web .
J'ai un filtre AuthorizeAttribute où j'ai besoin d'obtenir l'utilisateur actuel et d'ajouter des propriétés à récupérer plus tard par les contrôleurs d'action.
Le problème est que je dois utiliser le HttpContext qui appartient à System.Web. Existe-t-il une alternative à HttpContext pour 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);
}
}
Remarque: j'ai trouvé cette question , ce qui semble être un doublon, mais demande une solution fonctionnant pour le projet NancyFx, qui n'est pas valable pour moi.
Cet article me donne la solution:
L'API Web 2 a introduit une nouvelle classe RequestContext qui contient une propriété Principal. Il s'agit désormais de l'emplacement approprié pour rechercher l'identité de l'appelant. Cela remplace les mécanismes antérieurs de Thread.CurrentPrincipal et/ou HttpContext.User. C'est également à cela que vous attribuez si vous écrivez du code pour authentifier l'appelant dans l'API Web.
Il suffit donc de modifier la ligne:
Guid userId = new Guid(HttpContext.Current.User.Identity.GetUserId());
par
Guid userId = new Guid(actionContext.RequestContext.Principal.Identity.GetUserId());
maintenant, la référence à System.Web n'est plus nécessaire.
Vous pouvez utiliser OwinRequestScopeContext . Qui fait exactement ce que vous recherchez.
Après avoir lu ceci . Il me semble que l'extension d'AutorizeAttribute est encore la voie à suivre. Cependant, étant donné que HttpContext est basé sur IIS, nous voulons éviter de l'utiliser à partir de maintenant.
Il y a un HttpActionContext passé. Ensuite, nous pourrions utiliser
actionContext.Request.GetRequestContext().Principal.Identity
ou
actionContext.RequestContext.Principal.Identity
OR
actionContext.Request.GetOwinContext().Request.User.Identity
pour accéder à l'identité. Tous les trois vous procureront le même objet d'identité.
et oui, OwinContext est également disponible de cette façon.