Alternative à L'utilisation de HttpContext dans le système.Web for Owin

ASP.NET l'authentification est maintenant basée sur L'middleware OWIN qui peut être utilisé sur n'importe quel hôte basé sur OWIN. ASP.NET identité n'a aucune dépendance sur le système.Web .

j'ai un filtre AuthorizeAttribute où je dois obtenir l'utilisateur courant et ajouter quelques propriétés pour être récupéré plus tard par les contrôleurs d'action.

Le problème est que je dois utiliser le HttpContext qui appartient au Système.Web. Est-il une alternative de Httpcontexte 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);
    }
}

Note: j'ai trouvé cette question , qui semble un duplicata, mais demande une solution qui fonctionne pour le projet NancyFx, qui n'est pas valable pour moi.

22
demandé sur Community 2014-07-04 14:58:35

3 réponses

vous pouvez utiliser OwinRequestScopeContext . Ce qui est en train de faire exactement ce que vous cherchez.

11
répondu nsgocev 2014-07-04 11:02:54

cet article me donne la solution:

API Web 2 introduit un nouveau Classe RequestContext qui contient une propriété principale. C'est maintenant le bon endroit pour chercher l'identité de l'appelant. Ce remplace les mécanismes antérieurs du Thread.CurrentPrincipal et/ou HttpContext.Utilisateur. C'est aussi ce que vous pouvez assigner à si vous écriture de code pour authentifier l'appelant dans L'API Web.

donc il suffit 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 au Système.Le Web n'est plus nécessaire.

9
répondu Xavier Egea 2014-08-14 06:38:59

après ce . Il me semble que étendre Autorizeattribute est toujours la voie à suivre. Cependant, comme HttpContext est basé sur IIS, nous voulons éviter de l'utiliser à partir de maintenant.

il y a un HttpActionContext passé. Alors nous pourrions utiliser

actionContext.Request.GetRequestContext().Principal.Identity

ou

actionContext.RequestContext.Principal.Identity

ou

actionContext.Request.GetOwinContext().Request.User.Identity pour obtenir de l'identité. Tous les trois vous obtiendrez le même l'identité de l'objet.

et oui, OwinContext est également disponible de cette façon.

3
répondu Morio 2017-12-22 19:46:24