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?
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.
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!)
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
Vous devrez peut-être ajouter le paquet NuGet Microsoft.Owin.Host.SystemWeb
afin de faire ceci:
HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();
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>();
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
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;
}
}
Il me manquait paquet: Microsoft.AspNet.WebApi.Owin pour ApiControllers. J'espère que cela t'aides!
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 await
ed.
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.
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);`
(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:
HttpContext
etHttpRequest
.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.
Je devais ajouter un paquet Microsoft.AspNet.Identity.Owin