Impossible de trouver Request.GetOwinContext


101

Cela fait une heure que je cherche à comprendre pourquoi cela ne fonctionne pas.

J'ai une application ASP.Net MVC 5 avec une WebAPI. J'essaye d'obtenir l'authentification Request.GetOwinContext (). Cependant, je n'arrive pas à trouver comment inclure GetOwinContext. Voici mon code:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;
using TaskPro.Models;

namespace TaskPro.Controllers.api
{
    public class AccountController : ApiController
    {
        [HttpPost]
        [AllowAnonymous]
        public ReturnStatus Login(LoginViewModel model)
        { 
            if (ModelState.IsValid)
            {
                var ctx = Request.GetOwinContext(); // <-- Can't find this

                return ReturnStatus.ReturnStatusSuccess();
            }

            return base.ReturnStatusErrorsFromModelState(ModelState);
        }
    }
}

D'après ce que j'ai lu, cela devrait faire partie de System.Net.Http, mais j'ai inclus cela et cela ne résout toujours pas. Ctrl-Space ne me donne pas non plus d'options intellisense.

Qu'est-ce que j'oublie ici?


C'est dans l' System.Web.Httpespace de noms, mais il provient de la System.Web.Http.OwinDLL. Avez-vous mentionné cela?
Simon C

Ok, j'ai trouvé le package nuget pour Microsoft.AspNet.WebApi.Owin et l'ai installé, et j'ai inclus les utilisations pour System.Web.Http et System.Web.Http.Owin, mais cela ne fonctionne toujours pas.
Scottie

2
Désolé, mon commentaire ci-dessus devrait avoir lu System.Net.Httpnamespace. Vous n'avez donc pas besoin d'une utilisation pour .Owin, juste using System.Net.Httpce que vous avez déjà.
Simon C

Réponses:


163

La GetOwinContextméthode d'extension se trouve dans la System.Web.Http.Owindll qui doit être téléchargée en tant que package nuget (le nom du package nuget est Microsoft.AspNet.WebApi.Owin)

Install-Package Microsoft.AspNet.WebApi.Owin

Voir msdn ici: http://msdn.microsoft.com/en-us/library/system.net.http.owinhttprequestmessageextensions.getowincontext(v=vs.118).aspx

Package Nuget ici: https://www.nuget.org/packages/Microsoft.AspNet.WebApi.Owin

Cependant, la méthode fait toujours partie de l' System.Net.Httpespace de noms, donc les usingdéfinitions que vous avez devraient être correctes.

ÉDITER

D'accord, pour dissiper une certaine confusion: si vous utilisez un ApiController (ie MyController : ApiController), vous aurez besoin du Microsoft.AspNet.WebApi.Owinpackage.

Si vous utilisez un contrôleur Mvc standard (ie MyController : Controller), vous aurez besoin du Microsoft.Owin.Host.SystemWebpaquet.

Dans MVC 5, les pipelines pour Api et MVC standard étaient très différents, mais ont souvent les mêmes conventions de dénomination. Ainsi, une méthode d'extension dans l'un ne s'applique pas à l'autre. Idem pour beaucoup de filtres d'action, etc.


Le deuxième lien a fonctionné pour moi. Exécutez simplement Install-Package Microsoft.AspNet.WebApi.Owin dans votre gestionnaire de packages.
Rogala

La révocation des jetons est trop difficile !!! Mais cette réponse m'a finalement aidé à le faire fonctionner (en plus de le supprimer manuellement de la base de données, à laquelle j'ai accès). Je vous remercie!!
SlimsGhost

J'ai ce problème aussi mais j'ai utilisé Install-Package Microsoft.Owin.Host.SystemWeb pour résoudre le problème
hmfarimani

1
Je ne comprends pas pourquoi cela est considéré comme correct - cette méthode d'extension n'a rien à voir avec WebAPI, et en fait elle l'est Microsoft.Owin.Host.SystemWeb, non Microsoft.AspNet.WebApi.Owin.
John

2
@John - Si vous utilisez un contrôleur API dont vous avez besoin Microsoft.AspNet.WebApi.Owin. Si vous êtes dans un contrôleur MVC ordinaire, vous aurez besoin de Microsoft.Owin.Host.SystemWeb. L' Requestobjet est différent selon le type de contrôleur que vous utilisez, donc une méthode d'extension différente.
Simon C

49

Aucun de ceux-ci n'a fonctionné pour moi. J'ai dû comparer les packages Nuget avec celui qui a été créé avec Identity et j'ai trouvé ce package Nuget manquant qui, une fois ajouté, a résolu le problème pour moi

Microsoft.Owin.Host.SystemWeb

Apparemment, vous en avez besoin pour exécuter OWIN sur IIS à l'aide du pipeline de requêtes ASP.NET (lisez que vous êtes foutu sans cela!)


2
vous n'avez pas à exécuter sur IIS.
Trevor de Koekkoek

1
@TrevordeKoekkoek oui mais si vous lisez correctement le commentaire, cela indique que vous avez besoin de la bibliothèque pour fonctionner sur IIS (si vous voulez exécuter sur IIS, vous ne pouvez pas vous passer de cette bibliothèque)
Obi

1
vous avez besoin de ce package plus une utilisation de System.Web; déclaration.
Murariu Serban

Cela a résolu le problème pour moi. Merci!
Artorias2718

45

Dans l'API WEB, vous pouvez obtenir la référence en utilisant ce qui suit:

HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();

cela fonctionne dans Identity 2.0


5
-1 Cela nécessite une dépendance sur System.Web, qui n'est pas disponible dans les scénarios auto-hébergés.
Kugel le

6
Après tout ce temps, les gens utilisent toujours HttpContext.Current? Ce n'est pas testable. le contexte doit être injecté.
Trevor de Koekkoek

1
Seule l'installation du package Nuget Microsoft.Owin.Host.SystemWeb a fonctionné pour moi
Himalaya Garg

21

Vous devrez peut-être ajouter le package NuGet Microsoft.Owin.Host.SystemWebpour ce faire:

HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();

7

Dans mon cas, je dois ajouter

using Microsoft.AspNet.Identity.Owin;

pour résoudre GetOwinContext puis GetUserManager dans la ligne suivante.

Request.GetOwinContext().GetUserManager<ApplicationUserManager>();


2

Cela m'a pris une éternité pour trouver une réponse simple: mais ce que j'ai fait a été d'utiliser l'extension Get de l'instance unique de IOwinContext qui a été instanciée au démarrage. Donc c'est sorti comme ça:

private readonly IOwinContext _iOwinContext = HttpContext.Current.GetOwinContext();

public ApplicationUserManager UserManager
    {
        get
        {
            return _userManager ?? _iOwinContext.Get<ApplicationUserManager>() ;
        }
        private set
        {
            _userManager = value;
        }
    }

1

La GetOwinContext()méthode d'extension n'est pas trouvée dans les threads autres que le thread GUI.

Veillez donc à ne pas appeler cette fonction à partir d'une awaitfonction ed.


1

Après avoir examiné le projet par défaut ASP.NET, j'ai découvert que je devais l'inclure dans le démarrage de mon application:

// Enable the application to use a cookie to store information for the signed in user
// and to use a cookie to temporarily store information about a user logging in 
// with a third party login provider
app.UseCookieAuthentication(new CookieAuthenticationOptions());
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);`

1

Il me manquait un package: Microsoft.AspNet.WebApi.Owin pour ApiControllers. J'espère que cela t'aides!


1

J'ai eu ce même problème et je l'ai résolu en utilisant une méthode privée: private IAuthenticationManager AuthenticationManager { get { return HttpContext.Current.GetOwinContext().Authentication; } }

Cela a fonctionné à merveille pour moi.


1

(S'il vous plaît noter que cette réponse est pour l' API Web ASP.NET qui correspond à l'étiquette utilisée sur la question. Voir cette question si votre demande est par rapport à ASP.NET MVC.)

La question ne spécifie pas comment le service API Web ASP.NET doit être hébergé . Le dialogue dans cet article indique (c'est moi qui souligne):

kichalla a écrit le 24 octobre 2014 à 01h35

Si vous n'êtes PAS auto-hébergé, n'utilisez pas le package Microsoft.AspNet.WebApi.Owin avec IIS ... ce package est uniquement censé être utilisé avec l' auto-hébergement .

L'utilisation du Microsoft.AspNet.WebApi.Owinpackage est recommandée dans la réponse acceptée . Dans cette réponse, je signale ce qui a fonctionné pour moi lors de l' hébergement d'un service API Web ASP.NET dans IIS .

Tout d'abord, installez le package NuGet suivant:

Microsoft.Owin.Host.SystemWeb

Serveur OWIN qui permet aux applications basées sur OWIN de s'exécuter sur IIS à l'aide du pipeline de requêtes ASP.NET.

(Notez qu'au moment où j'écris, la dernière version disponible de ce package NuGet est 3.1.0 . De plus, dans la mesure où cela peut avoir de l'importance, j'utilise Visual Studio 2013 Update 5.)

Après avoir installé ce package NuGet, vous pouvez effectuer les opérations suivantes:

using Microsoft.Owin;
using System.Web;

IOwinContext context = HttpContext.Current.GetOwinContext();
// or
IOwinContext context = HttpContext.Current.Request.GetOwinContext();

Maintenant, pour faire la lumière sur la façon dont ces déclarations sont résolues. Dans Visual Studio, si vous cliquez GetOwinContextavec le bouton droit sur l'une ou l'autre instruction et sélectionnez «Peek Definition», Visual Studio affichera les éléments suivants:

// Assembly Microsoft.Owin.Host.SystemWeb.dll, v3.1.0.0

using Microsoft.Owin;
using System;
using System.Runtime.CompilerServices;

namespace System.Web
{
    public static class HttpContextExtensions
    {
        public static IOwinContext GetOwinContext(this HttpContext context);
        public static IOwinContext GetOwinContext(this HttpRequest request);
    }
}

Comme vous pouvez le voir, dans l' System.Webespace de noms, il existe deux GetOwinContext méthodes d'extension:

  • Un sur la HttpContextclasse, et
  • L'autre sur la HttpRequestclasse.

Encore une fois, pour ceux qui hébergent leur service API Web dans IIS, j'espère que cela dissipera toute ambiguïté quant à l'endroit où une définition de GetOwinContextpeut être trouvée par rapport à cette date tardive en 2017.


0

J'ai dû ajouter un package Microsoft.AspNet.Identity.Owin

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.