web-dev-qa-db-fra.com

Impossible de trouver Request.GetOwinContext

Je cherche depuis une heure à essayer de comprendre pourquoi cela ne fonctionne pas.

J'ai une application ASP.Net MVC 5 avec une WebAPI. J'essaie d'obtenir Request.GetOwinContext (). Authentification, mais 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 je l'ai inclus et cela ne résout toujours pas. Ctrl-Espace ne me donne pas non plus d'options intellisense.

Qu'est-ce que j'oublie ici?

91
Scottie

La méthode d'extension GetOwinContext se trouve dans la System.Web.Http.Owin dll qui doit être téléchargé sous forme de package de nuget (le nom du package de 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

Nuget package here: https://www.nuget.org/packages/Microsoft.AspNet.WebApi.Owin

Cependant, la méthode fait toujours partie de la System.Net.Http espace de noms, les définitions de using devraient donc aller.

[~ # ~] éditer [~ # ~]

Ok, pour dissiper une certaine confusion: si vous utilisez un ApiController (c.-à-d. MyController : ApiController) vous aurez besoin du Microsoft.AspNet.WebApi.Owin paquet.

Si vous utilisez un contrôleur MVC standard (c.-à-d. MyController : Controller) vous aurez besoin du Microsoft.Owin.Host.SystemWeb paquet.

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

149
Simon C

Aucun de ceux-ci n'a fonctionné pour moi. Je devais comparer les paquets Nuget avec ceux qui avaient été créés avec Identity et j'ai trouvé ce paquet 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 en utilisant le pipeline de demandes ASP.NET (lisez, vous êtes foutu sans cela!)

47
Obi Onuorah

Dans l'API WEB, vous pouvez obtenir la référence à l'aide des éléments suivants:

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

ça marche dans Identity 2.0

42
user3572087

Vous devrez peut-être ajouter le paquet NuGet Microsoft.Owin.Host.SystemWeb afin de faire ceci:

HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();
20
Serj Sagan

Dans mon cas j'ai besoin d'ajouter

using Microsoft.AspNet.Identity.Owin;

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

Request.GetOwinContext().GetUserManager<ApplicationUserManager>();
7
Muhammad Ramzan

J'ai ce problème et je télécharge un paquet supplémentaire à partir de nuget pour résoudre mon problème, (exécutez la commande suivante dans la console du gestionnaire de packages) Install-Package Microsoft.Owin.Host.SystemWeb

5
hmfarimani

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

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

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

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

1
D-Go

La méthode d'extension GetOwinContext() est introuvable dans les threads autres que le thread d'interface graphique.

Veillez donc à ne pas appeler cette fonction depuis aucune fonction awaited.

1
AxD

J'ai eu ce même problème et 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
user5655470

Après avoir examiné le projet ASP.NET par défaut, 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
drobison

(Veuillez noter que cette réponse concerne l'API Web ASP.NET qui correspond à la balise utilisée pour la question. Voir cette question si votre requête concerne 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 (emphase mienne):

kichalla a écrit: Oct 24, 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 auto-hébergement .

Utilisation du Microsoft.AspNet.WebApi.Owin Le paquet est recommandé dans le réponse acceptée . Dans cette réponse, je rapporte ce qui a fonctionné pour moi lorsque héberge un service API Web ASP.NET dans IIS .

Commencez par installer le paquet NuGet suivant:

Microsoft.Owin.Host.SystemWeb

Serveur OWIN permettant aux applications OWIN de s'exécuter sur IIS à l'aide du pipeline de demandes ASP.NET.

(Notez que, au moment où j'écris, la dernière version disponible de ce paquet NuGet est 3.1.0 . De plus, dans la mesure du possible, je suis en utilisant Visual Studio 2013 Update 5.)

Après avoir installé ce paquet 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();

Voyons maintenant comment ces déclarations sont résolues. Dans Visual Studio, si vous cliquez avec le bouton droit de la souris sur GetOwinContext dans l'une de ces instructions et que vous sélectionnez "Définition Peek", 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 constater, dans le System.Web espace de noms, il y a deuxGetOwinContext méthodes d'extension:

  • Un sur la classe HttpContext et
  • L'autre sur la classe HttpRequest.

Encore une fois, pour ceux qui hébergent leur service API Web dans IIS, j'espère que cela clarifiera toute ambiguïté quant à la définition de GetOwinContext par rapport à cette date tardive de 2017.

1
DavidRR

Je devais ajouter un paquet Microsoft.AspNet.Identity.Owin

0
GraehamF