Request.GetOwinContext kann nicht gefunden werden


101

Ich habe eine Stunde lang gesucht, um herauszufinden, warum dies nicht funktioniert.

Ich habe eine ASP.Net MVC 5-Anwendung mit einer WebAPI. Ich versuche, Request.GetOwinContext (). Authentication zu erhalten, aber ich kann anscheinend nicht finden, wie GetOwinContext eingeschlossen werden kann. Hier ist mein 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);
        }
    }
}

Nach dem, was ich gelesen habe, sollte es Teil von System.Net.Http sein, aber ich habe das aufgenommen und es wird immer noch nicht aufgelöst. Strg-Leertaste gibt mir auch keine Intellisense-Optionen.

Was fehlt mir hier?


Es ist im System.Web.HttpNamespace, aber es ist aus der System.Web.Http.OwinDLL. Haben Sie darauf verwiesen?
Simon C

Ok, ich habe das Nuget-Paket für Microsoft.AspNet.WebApi.Owin gefunden und installiert und die Verwendungen für System.Web.Http und System.Web.Http.Owin eingeschlossen, aber es funktioniert immer noch nicht.
Scottie

2
Entschuldigung, mein obiger Kommentar sollte den System.Net.HttpNamespace gelesen haben . Sie brauchen also keine Verwendung für .Owin, nur using System.Net.Httpdie Sie bereits haben.
Simon C

Antworten:


163

Die GetOwinContextErweiterungsmethode befindet sich in der System.Web.Http.OwinDLL, die als Nuget-Paket heruntergeladen werden muss (Der Name des Nuget-Pakets lautet Microsoft.AspNet.WebApi.Owin).

Install-Package Microsoft.AspNet.WebApi.Owin

Siehe msdn hier: http://msdn.microsoft.com/en-us/library/system.net.http.owinhttprequestmessageextensions.getowincontext(v=vs.118).aspx

Nuget-Paket hier: https://www.nuget.org/packages/Microsoft.AspNet.WebApi.Owin

Die Methode ist jedoch immer noch Teil des System.Net.HttpNamespace, daher sollten die usingDefinitionen, die Sie haben, in Ordnung sein.

BEARBEITEN

Okay, um Verwirrung zu beseitigen: Wenn Sie einen ApiController (dh MyController : ApiController) verwenden, benötigen Sie das Microsoft.AspNet.WebApi.OwinPaket.

Wenn Sie einen normalen Mvc-Controller (dh MyController : Controller) verwenden, benötigen Sie das Microsoft.Owin.Host.SystemWebPaket.

In MVC 5 waren die Pipelines für Api und reguläres MVC sehr unterschiedlich, haben jedoch häufig die gleichen Namenskonventionen. Eine Erweiterungsmethode in der einen gilt also nicht für die andere. Gleiches gilt für viele Aktionsfilter usw.


Der zweite Link hat bei mir funktioniert. Führen Sie einfach das Installationspaket Microsoft.AspNet.WebApi.Owin in Ihrem Paketmanager aus.
Rogala

Token-Widerruf ist zu schwer !!! Aber diese Antwort hat mir endlich geholfen, es zum Laufen zu bringen (und es manuell aus der Datenbank zu löschen, auf die ich Zugriff habe). Danke dir!!
SlimsGhost

Ich habe dieses Problem auch, aber ich habe Install-Package Microsoft.Owin.Host.SystemWeb verwendet, um das Problem zu lösen
hmfarimani

1
Ich verstehe nicht, warum dies als richtig erachtet wird - diese Erweiterungsmethode hat nichts mit WebAPI zu tun, und tatsächlich ist es in Microsoft.Owin.Host.SystemWeb, nicht Microsoft.AspNet.WebApi.Owin.
John

2
@ John - Wenn Sie einen API-Controller verwenden, benötigen Sie Microsoft.AspNet.WebApi.Owin. Wenn Sie sich in einem normalen MVC-Controller befinden, benötigen Sie Microsoft.Owin.Host.SystemWeb. Das RequestObjekt unterscheidet sich je nachdem, welchen Controllertyp Sie verwenden, also eine andere Erweiterungsmethode.
Simon C

49

Nichts davon hat bei mir funktioniert. Ich musste Nuget-Pakete mit einem vergleichen, das mit Identity erstellt wurde, und fand, dass dieses Nuget-Paket fehlte, wodurch das Problem beim Hinzufügen behoben wurde

Microsoft.Owin.Host.SystemWeb

Anscheinend benötigen Sie es, um OWIN unter IIS mithilfe der ASP.NET-Anforderungspipeline auszuführen (lesen Sie, dass Sie ohne es geschraubt sind!).


2
Sie müssen nicht auf IIS ausgeführt werden.
Trevor de Koekkoek

1
@TrevordeKoekkoek ja, aber wenn Sie den Kommentar richtig lesen, heißt es, dass Sie die Bibliothek benötigen, um auf IIS ausgeführt zu werden (Wenn Sie auf IIS ausgeführt werden möchten, können Sie nicht auf diese Bibliothek verzichten)
Obi

1
Sie benötigen dieses Paket plus ein using System.Web; Aussage.
Murariu Serban

Es hat das Problem für mich behoben. Vielen Dank!
Artorias2718

45

In der WEB-API können Sie die Referenz wie folgt abrufen:

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

es funktioniert in Identity 2.0


5
-1 Dies erfordert eine Abhängigkeit von System.Web, die in selbst gehosteten Szenarien nicht verfügbar ist.
Kugel

6
Nach all dieser Zeit verwenden die Leute immer noch HttpContext.Current? Es ist nicht testbar. Kontext sollte injiziert werden.
Trevor de Koekkoek

1
Nur die Installation des Nuget-Pakets Microsoft.Owin.Host.SystemWeb funktionierte für mich
Himalaya Garg

21

Möglicherweise müssen Sie dazu das NuGet-Paket hinzufügen Microsoft.Owin.Host.SystemWeb:

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

7

In meinem Fall muss ich hinzufügen

using Microsoft.AspNet.Identity.Owin;

zum Auflösen von GetOwinContext und dann von GetUserManager in der folgenden Zeile.

Request.GetOwinContext().GetUserManager<ApplicationUserManager>();


2

Ich habe ewig gebraucht, um eine einfache Antwort zu finden: Ich habe jedoch die Get-Erweiterung der einzelnen Instanz des IOwinContext verwendet, die beim Start instanziiert wurde. So kam es heraus:

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

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

1

Das GetOwinContext() Erweiterungsmethode wird nicht in anderen Threads als dem GUI-Thread gefunden.

Achten Sie also darauf, diese Funktion nicht innerhalb einer awaited-Funktion aufzurufen .


1

Nachdem ich mir das ASP.NET-Standardprojekt angesehen hatte, stellte ich fest, dass ich dies in meinen Anwendungsstart einbeziehen musste:

// 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

Mir fehlte das Paket: Microsoft.AspNet.WebApi.Owin für ApiController. Hoffe das hilft!


1

Ich hatte das gleiche Problem und löste es mit einer privaten Methode: private IAuthenticationManager AuthenticationManager { get { return HttpContext.Current.GetOwinContext().Authentication; } }

Das hat bei mir gut funktioniert.


1

(Bitte beachten Sie, dass diese Antwort für die ASP.NET-Web-API gilt, die dem für die Frage verwendeten Tag entspricht. Siehe diese Frage wenn sich Ihre Anfrage auf ASP.NET MVC bezieht.)

Die Frage gibt nicht an, wie der ASP.NET-Web-API-Dienst gehostet werden soll . Der Dialog in diesem Beitrag zeigt an (Hervorhebung von mir):

kichalla schrieb am 24. Oktober 2014 um 01:35 Uhr

Wenn Sie NICHT selbst hosten, verwenden Sie das Microsoft.AspNet.WebApi.Owin- Paket nicht mit IIS. Dieses Paket sollte nur mit Selbsthosting verwendet werden .

Die Verwendung des Microsoft.AspNet.WebApi.OwinPakets wird in der akzeptierten Antwort empfohlen . In dieser Antwort berichte ich, was beim Hosten eines ASP.NET-Web-API-Dienstes in IIS für mich funktioniert hat .

Installieren Sie zunächst das folgende NuGet-Paket:

Microsoft.Owin.Host.SystemWeb

OWIN-Server, mit dem OWIN-basierte Anwendungen unter Verwendung der ASP.NET-Anforderungspipeline auf IIS ausgeführt werden können.

(Beachten Sie, dass beim Schreiben die neueste verfügbare Version dieses NuGet-Pakets 3.1.0 ist . Soweit dies von Bedeutung ist, verwende ich Visual Studio 2013 Update 5.)

Nach der Installation dieses NuGet-Pakets können Sie Folgendes tun:

using Microsoft.Owin;
using System.Web;

IOwinContext context = HttpContext.Current.GetOwinContext();
// or
IOwinContext context = HttpContext.Current.Request.GetOwinContext();

Um nun etwas Licht ins Dunkel zu bringen, wie diese Aussagen gelöst werden. Wenn Sie in Visual Studio mit der rechten Maustaste GetOwinContextauf eine der Anweisungen klicken und "Peek Definition" auswählen, zeigt Visual Studio Folgendes an:

// 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);
    }
}

Wie Sie sehen können System.Web, gibt es im Namespace zwei GetOwinContext Erweiterungsmethoden:

  • Einer auf dem HttpContext Klasse und
  • Der andere in der HttpRequestKlasse.

Ich hoffe erneut, dass diejenigen, die ihren Web-API-Dienst in IIS hosten, Unklarheiten darüber beseitigen, wo eine Definition für GetOwinContextdieses späte Datum im Jahr 2017 zu finden ist.


0

Ich musste Paket hinzufügen Microsoft.AspNet.Identity.Owin

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.