ASP.NET-Identität - HttpContext hat keine Erweiterungsmethode für GetOwinContext

384

Ich habe das ASP.NET-Identitätsbeispiel von hier heruntergeladen und erfolgreich ausgeführt: https://github.com/rustd/AspnetIdentitySample

Ich bin gerade dabei, das ASP.NET Identity Framework in meinem Projekt zu implementieren, und bin auf ein Problem gestoßen, das mich den ganzen Tag verrückt gemacht hat ...

GetOwinContext() existiert nicht als Erweiterungsmethode auf meinem HttpContext

Ich implementiere das Identitätsframework in der Klassenbibliothek. Ich habe die neueste Version (Vorabversion) des Identity-Frameworks installiert und alles - abgesehen davon - funktioniert einwandfrei.

Ich habe versucht, denselben Code wie denselben Direct in meinem Controller zu implementieren, und finde dasselbe Problem.

Ich vermisse eindeutig irgendwo eine Referenz, obwohl ich keine Ahnung habe, was ..! ..

Der Codeblock, der mich umbringt, ist:

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

Ich habe Verweise auf Folgendes hinzugefügt - habe diese sowohl in meiner Klassenbibliothek als auch direkt auf dem Controller ausprobiert, keiner von ihnen funktioniert für mich ...

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

... das treibt mich die Wand hoch ... irgendeine Idee?

AKTUALISIEREN

Ich habe die Versionen von Identity & OWIN im Beispiel überprüft und sichergestellt, dass meine Lösung dieselben Versionen enthält.

Mehr noch, wenn ich den Objektbrowser im Beispiel nach suche, GetOwinContextkann ich die Methode finden, aber wenn ich in meiner Lösung danach suche, ist sie nirgends zu finden ... Ich muss eine Bibliothek veraltet haben, aber ich kann ' finde es nicht!

Darren Wainwright
quelle

Antworten:

713

ARGH!

Ich habe es gefunden ... Ich hatte kein zusätzliches Paket namensMicrosoft.Owin.Host.SystemWeb

Sobald ich dies gesucht und installiert habe, hat es funktioniert.

Jetzt bin ich mir nicht sicher, ob ich einfach alles verpasst habe, obwohl ich beim Durchlaufen verschiedener Tutorials KEINEN Hinweis auf eine solche Bibliothek oder ein solches Paket gefunden habe. Es wurde auch nicht installiert, als ich all dieses Identity Framework installiert habe ... Ich bin mir nicht sicher, ob es nur ich war.

BEARBEITEN Obwohl es sich in der Microsoft.Owin.Host.SystemWebAssembly befindet, handelt es sich um eine Erweiterungsmethode im System.WebNamespace. Sie müssen also den Verweis auf den ersteren haben und usingder letztere sein.

Darren Wainwright
quelle
6
Vielen Dank, dass Sie das herausgefunden haben: Ich verwende dieses Tutorial asp.net/identity/overview/getting-started/… und es ist ein fehlender Schritt
frenchie
23
@tne - danke für deinen Kommentar ... obwohl ich kaum "ziellos herumgerannt" bin - habe ich ein Tutorial von einer vertrauenswürdigen Ressource verfolgt; von der asp.net Seite nicht weniger. Sie hatten diesen Schritt nicht in ihrem Tutorial (es wurde inzwischen hinzugefügt) - auch die Tatsache, dass die Leute sowohl diese Antwort als auch das ursprüngliche Q positiv bewerten, zeigt auch, dass ich nicht der einzige mit diesem Problem war.
Darren Wainwright
5
@ Darren, fair genug. (Mir ist klar, dass ich das anders hätte formulieren können.)
27.
3
Nur als Referenz: nuget.org/packages/Microsoft.Owin.Host.SystemWeb/2.1.0
Chris Bohatka
5
Ich weiß nicht, ob es sich um eine Aktualisierung dieser Referenz handelt, aber ich musste meine Zuordnung ein wenig ändern var authenticationManager = HttpContext.Current.GetOwinContext().Authentication;(Aktuell enthalten, wo sie nicht in der Frage enthalten war).
Ortund
177

Ich glaube, Sie müssen den Strom referenzieren, HttpContextwenn Sie sich außerhalb des Controllers befinden. Die MVC-Controller haben einen Basisverweis auf den aktuellen Kontext. Darüber hinaus müssen Sie jedoch explizit angeben, dass Sie den aktuellen Wert möchtenHttpContext

return HttpContext.Current.GetOwinContext().Authentication;

Da eine neue MVC 5-Projektvorlage mit dem oben angezeigten Code nicht angezeigt wird, IAuthenticationManagerenthält sie die folgenden using-Anweisungen oben im Account Controller:

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;

Wenn Sie jedes einzelne auskommentieren, scheint es, dass es GetOwinContext()tatsächlich Teil der System.Web.Mvc-Assembly ist.

Tommy
quelle
Ich habe es versucht und kann es einfach nicht finden. - das GetOwinContext () meine ich.
Darren Wainwright
2
@Darren - Ich habe ein wenig mit der Beispielvorlage gespielt und möglicherweise die Baugruppe, die Sie vermissen. Sieht so aus, als müssten Sie System.Web.Mvcaus Ihrem Klassenprojekt referenzieren . Wenn auskommentiert, ist es das, HttpContext.GetOwinContext()was unbekannt geworden ist (und nicht die Microsoft.Owin.SecurityVersammlung)
Tommy
Ich habe versucht, dies auch direkt auf einem Controller zum Laufen zu bringen - und kann es wieder nicht finden.
Darren Wainwright
19
Das hat mich gestolpert. HttpContextDie ControllerKlasse verfügt über eine öffentliche Eigenschaft. Wenn Sie also davon erben, HttpContext.GetOwinContext()funktioniert dies wie erwartet. Wenn Sie jedoch erben ApiController, gibt es keine solche Eigenschaft. Verweist daher HttpContextauf die Klasse, für die Sie auf Currenteine Instanz der Klasse zugreifen müssen. Wenn Sie also Code von einem Controller in einen ApiController kopieren / einfügen und sich fragen, warum er nicht funktioniert, ist dies die Antwort für Sie.
David Miani
"Current" war das Problem für mich
Klicken Sie auf Ok
24

Nach Versuch und Irrtum werden die using-Anweisungen meines Controllers und des Asp.Net Template-Controllers verglichen

using System.Web;

Das Problem wurde für mich gelöst. Sie müssen außerdem Folgendes hinzufügen:

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

So verwenden Sie die GetUserManager-Methode

Microsoft konnte keine Möglichkeit finden, dies automatisch mit einem Rechtsklick zu beheben und wie andere fehlende Anweisungen zu beheben?

Ronen Festinger
quelle
1
Das hat auch bei mir funktioniert. Ich hatte bereits die Identitätsbibliotheken, aber es scheint System.Web zu benötigen.
SouthShoreAK
1
Dies hat sich anscheinend viel bewegt, sowohl in Assemblys als auch in Namespaces. Macht es wirklich schmerzhaft, wenn es sich um eine Erweiterungsmethode handelt. Ich habe alle meine Bibliotheken aktualisiert und diese Antwort gibt an, wo sie sich gerade befindet.
Shannon
Ah, du alte Hölle in einer neuen Form
JustJohn
1
Ja, leider können Erweiterungsmethoden nicht automatisch aufgelöst werden.
Ronen Festinger
22

In meinem Fall hat das Hinzufügen der Microsoft.AspNet.WebApi.Owin- Referenz über Nuget den Trick getan.

Dolce Vita
quelle
Ja, das hat es für mich in der aktuellen Version getan. Die Erweiterungsmethode befindet sich in diesem Paket, das Assemby System.Web.Http.Owin und im Namespace System.Net.Http
oatsoda
16

Stellen Sie sicher, dass Sie das Nuget-Paket installiert haben Microsoft.AspNet.Identity.Owin. Fügen Sie dann den System.Net.HttpNamespace hinzu.

CodeNotFound
quelle
Ich hatte das auch dabei. Es stellte sich heraus, dass bei der Installation des Identity-Materials eine andere Bibliothek NICHT installiert war.
Darren Wainwright
@Darren Bitte fügen Sie den Paketnamen hinzu. Vielen Dank
Saturn Technologies
6
@ SaturnTechnologies Für mich war das andere Paket Microsoft.Owin.Host.SystemWeb und Namespace System.Web
WiSeeker
1
Ich zweiter WiSeeker. Für mich hat das nicht geholfen. Darrens Vorschlag zur Installation hat es Microsoft.Owin.Host.SystemWebjedoch geschafft.
Max Barraclough
13

Nur mit

HttpContext.Current.GetOwinContext ()

habe den Trick in meinem Fall gemacht.

Honza P.
quelle
10

Für Entwickler, die diesen Fehler im Web-API-Projekt erhalten -

Die GetOwinContext-Erweiterungsmethode ist in der System.Web.Http.OwinDLL definiert und es wird ein weiteres Paket benötigt, d Microsoft.Owin.Host.SystemWeb. H. Dieses Paket muss von nuget in Ihrem Projekt installiert werden.

Link zum Paket : OWIN Package Install Command -

Install-Package Microsoft.AspNet.WebApi.Owin    

Link zum System.web-Paket : Paketinstallationsbefehl -

Install-Package Microsoft.Owin.Host.SystemWeb

Um diesen Fehler zu beheben, müssen Sie herausfinden, warum er in Ihrem Fall auftritt. Bitte überprüfen Sie die folgenden Punkte in Ihrem Code -

  1. Sie müssen einen Verweis auf haben Microsoft.AspNet.Identity.Owin;

    using Microsoft.AspNet.Identity.Owin;

  2. Definieren Sie GetOwinContext()unter HttpContext.Currentwie folgt -

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

    ODER

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

Vollständiger Code Wo GetOwinContext () verwendet wird -

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

Ich verwende Namespace in einer Codedatei, in der GetOwinContext () verwendet wird

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;

Ich habe diesen Fehler beim Verschieben meines Codes von einem Projekt in ein anderes erhalten.

Heemanshu Bhalla
quelle
4

So rufen Sie UserManager in der API ab

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

Dabei ist AppUserManager die Klasse, die von UserManager erbt.

Ashraf Maher
quelle
4

Ich hatte alle richtigen Pakete und Verwendungen, musste aber erst bauen, bevor ich GetOwinContext()zur Arbeit gehen konnte.

Kevin Raffay
quelle
Wie haben Sie Ihren Build repariert, damit er beim ersten Mal funktioniert?
Nordes
@Nordes Manchmal kann VS nicht im Hintergrund erstellt werden (dh es wird angezeigt, dass Kompilierungsfehler vorliegen), aber wenn Sie einen echten Build auslösen (oder häufiger bereinigen und dann erstellen), wird dies erledigt. Das hat Kevin wahrscheinlich erlebt.
Maverick
0

Installieren Sie einfach dieses Paket und Ihr Code funktioniert: => Install-Package Microsoft.Owin.Host.SystemWeb -Version 2.1.0

Muhammad Ayyaz
quelle