Identité ASP.NET - HttpContext n'a pas de méthode d'extension pour GetOwinContext

384

J'ai téléchargé et exécuté avec succès l'exemple d'identité ASP.NET à partir d'ici: https://github.com/rustd/AspnetIdentitySample

Je suis maintenant en train d'implémenter le framework d'identité ASP.NET dans mon projet et j'ai rencontré un problème qui m'a rendu fou toute la journée ...

GetOwinContext() n'existe pas comme méthode d'extension sur mon HttpContext

J'implémente le cadre d'identité dans la bibliothèque de classes. J'ai installé toutes les dernières (version préliminaire) du framework Identity et tout - à part cela - fonctionne bien.

J'ai essayé d'implémenter le même code que le même direct dans mon contrôleur et je trouve le même problème.

Il me manque clairement une référence quelque part, bien que je ne sache pas quoi ..! ..

Le bloc de code qui me tue est:

private IAuthenticationManager AuthenticationManager
{
    get
    {
        return HttpContext.GetOwinContext().Authentication;
    }
}

J'ai ajouté des références aux éléments suivants - j'ai essayé ces deux dans ma bibliothèque de classe et aussi directement sur le contrôleur, aucun d'entre eux ne fonctionne pour moi ...

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using Microsoft.Owin.Security;
using Microsoft.Owin;
using System.Web;

... ça me fait monter le mur .... une idée?

MISE À JOUR

J'ai vérifié les versions d'Identity & OWIN dans l'exemple, et je me suis assuré d'avoir les mêmes versions dans ma solution.

Plus encore, si je recherche dans l'explorateur d'objets sur l'échantillon, GetOwinContextje peux trouver la méthode, mais quand je la recherche dans ma solution, elle est introuvable ... Je dois avoir une bibliothèque obsolète, mais je peux ' t le trouver!

Darren Wainwright
la source

Réponses:

713

ARGH!

Je l'ai trouvé ... Je n'avais pas de paquet supplémentaire, appeléMicrosoft.Owin.Host.SystemWeb

Une fois que j'ai cherché et installé cela, cela a fonctionné.

Maintenant - je ne sais pas si j'ai tout raté, mais je n'ai trouvé aucune référence à une telle bibliothèque ou un tel package lors de la lecture de divers didacticiels. Il n'a pas non plus été installé lorsque j'ai installé tout ce cadre d'identité ... Je ne sais pas si c'était juste moi ..

EDIT Bien qu'il soit dans l' Microsoft.Owin.Host.SystemWebassembly, il s'agit d'une méthode d'extension dans l' System.Webespace de noms, vous devez donc avoir la référence à la première et être usingla seconde.

Darren Wainwright
la source
6
Merci d'avoir compris celui-là: j'utilise ce tutoriel asp.net/identity/overview/getting-started/… et c'est une étape manquante
frenchie
23
@tne - merci pour votre commentaire ... même si je ne "courais pas sans but" - je suivais un tutoriel d'une ressource de confiance; à partir du site asp.net non moins. Ils n'avaient pas cette étape dans leur tutoriel (il a depuis été ajouté) - aussi, le fait que les gens votent à la fois pour cette réponse et le Q original indique également que je n'étais pas le seul à avoir ce problème.
Darren Wainwright
5
@Darren, assez bien. (Je me rends bien compte que je pourrais avoir rédigé que différemment.)
TNE
3
Juste pour référence: nuget.org/packages/Microsoft.Owin.Host.SystemWeb/2.1.0
Chris Bohatka
5
Je ne sais pas si c'était à partir de la mise à jour de cette référence, mais j'ai dû changer un peu mon affectation en var authenticationManager = HttpContext.Current.GetOwinContext().Authentication;(actuel inclus là où il n'était pas là dans la question).
Ortund
177

Je pense que vous devez référencer le courant HttpContextsi vous êtes en dehors du contrôleur. Les contrôleurs MVC ont une référence de base au contexte actuel. Cependant, en dehors de cela, vous devez déclarer explicitement que vous voulez que le courantHttpContext

return HttpContext.Current.GetOwinContext().Authentication;

Quant à ne pas apparaître, un nouveau modèle de projet MVC 5 utilisant le code que vous montrez ci-dessus (le IAuthenticationManager) a les instructions using suivantes en haut du contrôleur de compte:

using System.Threading.Tasks;
using System.Web;
using System.Web.Mvc;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using Microsoft.Owin.Security;
using WebApplication2.Models;

Commentant chacun d'eux, il semble que ce GetOwinContext()soit en fait une partie de l'assembly System.Web.Mvc.

Tommy
la source
J'ai essayé cela et je ne le trouve pas. - le GetOwinContext () je veux dire.
Darren Wainwright
2
@Darren - J'ai joué un peu avec le modèle d'exemple et il se peut que l'assemblage vous manque. Il semble que vous devrez faire référence System.Web.Mvcà votre projet de classe. Quand cela est commenté, c'est ce qui a rendu HttpContext.GetOwinContext()inconnu (et non l' Microsoft.Owin.Securityassemblée)
Tommy
J'ai également essayé de faire fonctionner cela directement sur un contrôleur - et encore une fois, je ne le trouve pas.
Darren Wainwright
19
Cela m'a fait trébucher. Il y a une propriété publique HttpContextsur la Controllerclasse, donc si vous en héritez, HttpContext.GetOwinContext()fonctionne comme prévu. Si vous héritez de ApiControllercependant, il n'y a pas une telle propriété. Par conséquent, HttpContextfera référence à la classe, qui vous obligera à utiliser Currentpour accéder à une instance de la classe. Donc, si vous copiez / collez du code d'un contrôleur vers un ApiController et que vous vous demandez pourquoi cela ne fonctionne pas, c'est la réponse pour vous.
David Miani
"Current" était le piège pour moi
Cliquez sur Ok le
24

Après essai et erreur en comparant les instructions using de mon contrôleur et le contrôleur de modèle Asp.Net

using System.Web;

Résolu le problème pour moi. Vous devrez également ajouter:

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;

Pour utiliser la méthode GetUserManager.

Microsoft n'a pas pu trouver un moyen de résoudre ce problème automatiquement avec un clic droit et de le résoudre comme les autres instructions utilisant manquantes?

Ronen Festinger
la source
1
Cela a également fonctionné pour moi. J'avais déjà les bibliothèques d'identité, mais il semble avoir besoin de System.Web.
SouthShoreAK
1
Cela a apparemment beaucoup bougé, à la fois dans les assemblages et dans les espaces de noms. Cela est vraiment douloureux, car il s'agit d'une méthode d'extension. J'ai mis à jour toutes mes bibliothèques et cette réponse reflète où elle se trouve actuellement.
Shannon
ah, vous vous
enferez
1
Oui, malheureusement, les méthodes d'extension ne peuvent pas être résolues automatiquement.
Ronen Festinger
22

Dans mon cas, l'ajout de la référence Microsoft.AspNet.WebApi.Owin via nuget a fait l'affaire.

DolceVita
la source
Oui, cela l'a fait pour moi sur la dernière version actuelle. La méthode d'extension est dans ce package, qui est Assemby System.Web.Http.Owin et dans l' espace de noms System.Net.Http
oatsoda
16

Assurez-vous d'avoir installé le package nuget Microsoft.AspNet.Identity.Owin. Ajoutez ensuite un System.Net.Httpespace de noms.

CodeNotFound
la source
J'en avais un aussi. Il s'avère qu'il y avait une autre bibliothèque NON installée lors de l'installation des éléments d'identité.
Darren Wainwright
@Darren Veuillez ajouter le nom du package. Merci
Saturn Technologies
6
@SaturnTechnologies Pour moi, l'autre package était Microsoft.Owin.Host.SystemWeb et namespace System.Web
WiSeeker
1
J'appuie WiSeeker. Pour moi, cela n'a pas aidé. La suggestion de Darren d'installer a Microsoft.Owin.Host.SystemWebfait l'affaire.
Max Barraclough
13

Juste en utilisant

HttpContext.Current.GetOwinContext ()

a fait l'affaire dans mon cas.

Honza P.
la source
10

Pour les développeurs obtenant cette erreur dans Web API Project -

La méthode d'extension GetOwinContext est définie dans System.Web.Http.Owindll et un package supplémentaire sera nécessaire, c'est-à-dire Microsoft.Owin.Host.SystemWeb. Ce package doit être installé dans votre projet à partir de nuget.

Lien vers le package : commande d'installation du package OWIN -

Install-Package Microsoft.AspNet.WebApi.Owin    

Lien vers le package System.web : commande d'installation du package -

Install-Package Microsoft.Owin.Host.SystemWeb

Afin de résoudre cette erreur, vous devez trouver pourquoi elle se produit dans votre cas. Veuillez recouper les points ci-dessous dans votre code -

  1. Vous devez avoir une référence à Microsoft.AspNet.Identity.Owin;

    using Microsoft.AspNet.Identity.Owin;

  2. Définissez GetOwinContext()Under HttpContext.Currentcomme ci-dessous -

     return _userManager1 ?? HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();

    OU

    return _signInManager ?? HttpContext.Current.GetOwinContext().Get<ApplicationSignInManager>();

Code complet où GetOwinContext () est utilisé -

 public ApplicationSignInManager SignInManager
 {
   get
   {
    return _signInManager ?? HttpContext.Current.GetOwinContext().Get<ApplicationSignInManager>();
   }
    private set
    {
     _signInManager = value;
    }
  }

L'espace de noms que j'utilise dans le fichier de code où GetOwinContext () est utilisé

using AngularJSAuthentication.API.Entities;
using AngularJSAuthentication.API.Models;
using HomeCinema.Common;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Web;
using Microsoft.AspNet.Identity.Owin;
using Microsoft.Owin.Security.DataProtection;

J'ai eu cette erreur en déplaçant mon code d'un projet à un autre.

Heemanshu Bhalla
la source
4

Pour obtenir UserManager dans l'API

return HttpContext.Current.GetOwinContext().GetUserManager<AppUserManager>();

où AppUserManager est la classe qui hérite de UserManager.

Ashraf Maher
la source
4

J'avais tous les packages et utilisations corrects, mais je devais d'abord construire avant de pouvoir GetOwinContext()travailler.

Kevin Raffay
la source
Comment avez-vous réparé votre build pour qu'il fonctionne la première fois?
Nordes
@Nordes Parfois, VS ne parvient pas à construire en arrière-plan (c'est-à-dire: il vous indique qu'il y a des erreurs de compilation), mais déclencher une vraie construction (ou plus souvent nettoyer puis construire) le fera passer. C'est probablement ce que Kevin vivait.
Maverick
0

Installez simplement ce package et votre code fonctionnera: => Install-Package Microsoft.Owin.Host.SystemWeb -Version 2.1.0

Muhammad Ayyaz
la source