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#
asp.net-web-api
owin
Scottie
la source
la source
System.Web.Http
espace de noms, mais il provient de laSystem.Web.Http.Owin
DLL. Avez-vous mentionné cela?System.Net.Http
namespace. Vous n'avez donc pas besoin d'une utilisation pour.Owin
, justeusing System.Net.Http
ce que vous avez déjà.Réponses:
La
GetOwinContext
méthode d'extension se trouve dans laSystem.Web.Http.Owin
dll qui doit être téléchargée en tant que package nuget (le nom du package nuget est 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.Http
espace de noms, donc lesusing
dé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 duMicrosoft.AspNet.WebApi.Owin
package.Si vous utilisez un contrôleur Mvc standard (ie
MyController : Controller
), vous aurez besoin duMicrosoft.Owin.Host.SystemWeb
paquet.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.
la source
Microsoft.Owin.Host.SystemWeb
, nonMicrosoft.AspNet.WebApi.Owin
.Microsoft.AspNet.WebApi.Owin
. Si vous êtes dans un contrôleur MVC ordinaire, vous aurez besoin deMicrosoft.Owin.Host.SystemWeb
. L'Request
objet est différent selon le type de contrôleur que vous utilisez, donc une méthode d'extension différente.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
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!)
la source
Dans l'API WEB, vous pouvez obtenir la référence en utilisant ce qui suit:
cela fonctionne dans Identity 2.0
la source
Vous devrez peut-être ajouter le package NuGet
Microsoft.Owin.Host.SystemWeb
pour ce faire:la source
Dans mon cas, je dois ajouter
pour résoudre GetOwinContext puis GetUserManager dans la ligne suivante.
la source
J'ai ce problème et je télécharge un package supplémentaire à partir de nuget pour résoudre mon problème, (exécutez la commande suivante dans la console du gestionnaire de package) Install-Package Microsoft.Owin.Host.SystemWeb
la source
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:
la source
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
await
fonction ed.la source
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:
la source
Il me manquait un package: Microsoft.AspNet.WebApi.Owin pour ApiControllers. J'espère que cela t'aides!
la source
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.
la source
(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):
L'utilisation du
Microsoft.AspNet.WebApi.Owin
package 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:
(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:
Maintenant, pour faire la lumière sur la façon dont ces déclarations sont résolues. Dans Visual Studio, si vous cliquez
GetOwinContext
avec le bouton droit sur l'une ou l'autre instruction et sélectionnez «Peek Definition», Visual Studio affichera les éléments suivants:Comme vous pouvez le voir, dans l'
System.Web
espace de noms, il existe deuxGetOwinContext
méthodes d'extension:HttpContext
classe, etHttpRequest
classe.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
GetOwinContext
peut être trouvée par rapport à cette date tardive en 2017.la source
J'ai dû ajouter un package
Microsoft.AspNet.Identity.Owin
la source