web-dev-qa-db-fra.com

Alternative pour utiliser HttpContext dans System.Web pour Owin

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.

23
Xavier Egea

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.

9
Xavier Egea

Vous pouvez utiliser OwinRequestScopeContext . Qui fait exactement ce que vous recherchez.

9
nsgocev

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.

3
Morio