Nie można znaleźć Request.GetOwinContext


101

Szukałem przez godzinę, próbując dowiedzieć się, dlaczego to nie działa.

Mam aplikację ASP.Net MVC 5 z interfejsem WebAPI. Próbuję uzyskać Request.GetOwinContext (). Uwierzytelnianie, jednak nie mogę znaleźć sposobu uwzględnienia GetOwinContext. Oto mój kod:

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

Z tego, co przeczytałem, powinien być częścią System.Net.Http, ale włączyłem to i nadal nie jest rozwiązany. Ctrl-Space również nie daje mi żadnych opcji Intellisense.

Czego tu brakuje?


Znajduje się w System.Web.Httpprzestrzeni nazw, ale pochodzi z System.Web.Http.Owinbiblioteki dll. Czy wspomniałeś o tym?
Simon C

Ok, znalazłem pakiet NuGet dla Microsoft.AspNet.WebApi.Owin i zainstalowałem go oraz dołączyłem zastosowania dla System.Web.Http i System.Web.Http.Owin, ale nadal nie działa.
Scottie

2
Przepraszam, mój powyższy komentarz powinien przeczytać System.Net.Httpprzestrzeń nazw. Więc nie potrzebujesz użycia .Owin, po prostu using System.Net.Httpjuż masz.
Simon C

Odpowiedzi:


162

Metoda GetOwinContextrozszerzenia znajduje się w System.Web.Http.Owinbibliotece dll, którą należy pobrać jako pakiet nuget (nazwa pakietu nuget to Microsoft.AspNet.WebApi.Owin)

Install-Package Microsoft.AspNet.WebApi.Owin

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

Pakiet Nuget tutaj: https://www.nuget.org/packages/Microsoft.AspNet.WebApi.Owin

Jednak metoda jest nadal częścią System.Net.Httpprzestrzeni nazw, więc usingdefinicje, które masz, powinny być w porządku.

EDYTOWAĆ

OK, aby wyjaśnić pewne nieporozumienia: jeśli używasz ApiController (tj. MyController : ApiController), Będziesz potrzebować Microsoft.AspNet.WebApi.Owinpakietu.

Jeśli używasz zwykłego kontrolera MVC (tj. MyController : Controller), Będziesz potrzebować Microsoft.Owin.Host.SystemWebpakietu.

W MVC 5 potoki dla Api i zwykłego MVC były bardzo różne, ale często mają te same konwencje nazewnictwa. Zatem metoda rozszerzenia w jednej nie ma zastosowania do drugiej. To samo dotyczy wielu filtrów akcji itp.


Drugi link działał dla mnie. Po prostu uruchom Install-Package Microsoft.AspNet.WebApi.Owin w swoim menedżerze pakietów.
Rogala,

Odwołanie tokena jest zbyt trudne !!! Ale ta odpowiedź w końcu pomogła mi w uruchomieniu go (plus ręczne usunięcie go z bazy danych, do której mam dostęp). Dziękuję Ci!!
SlimsGhost

Mam ten problem zbyt ale Użyłem Install-Package Microsoft.Owin.Host.SystemWeb aby rozwiązać problem
hmfarimani

1
Nie rozumiem, dlaczego jest to uważane za poprawne - ta metoda rozszerzenia nie ma nic wspólnego z WebAPI i rzeczywiście jest w Microsoft.Owin.Host.SystemWeb, nie Microsoft.AspNet.WebApi.Owin.
John

2
@John - Jeśli używasz kontrolera API, którego potrzebujesz Microsoft.AspNet.WebApi.Owin. Jeśli używasz zwykłego kontrolera MVC, będziesz potrzebować Microsoft.Owin.Host.SystemWeb. RequestObiekt różni się w zależności od typu regulatora używasz więc inną metodę rozszerzenia.
Simon C

50

Żaden z nich nie działał dla mnie. Musiałem porównać pakiety Nuget z pakietem utworzonym za pomocą Identity i stwierdziłem, że brakuje tego pakietu Nuget, który po dodaniu rozwiązał problem

Microsoft.Owin.Host.SystemWeb

Najwyraźniej potrzebujesz go do uruchamiania OWIN w usługach IIS przy użyciu potoku żądań ASP.NET (przeczytaj, że masz spieprzone bez tego!)


2
nie musisz korzystać z usług IIS.
Trevor de Koekkoek

1
@TrevordeKoekkoek tak, ale jeśli dobrze przeczytasz komentarz, oznacza to, że potrzebujesz biblioteki do działania w IIS (jeśli chcesz działać w IIS, nie możesz obejść się bez tej biblioteki)
Obi

1
potrzebujesz tego pakietu plus using System.Web; komunikat.
Murariu Serban

Rozwiązało to dla mnie problem. Dzięki!
Artorias2718

45

W WEB API możesz uzyskać odniesienie, korzystając z:

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

działa w Identity 2.0


5
-1 Wymaga to zależności od System.Web, która nie jest dostępna w scenariuszach z własnym hostingiem.
Kugel

6
Po tym czasie ludzie nadal używają HttpContext.Current? Nie można tego przetestować. kontekst powinien zostać wstrzyknięty.
Trevor de Koekkoek

1
Tylko instalacja pakietu Nuget Microsoft.Owin.Host.SystemWeb działała dla mnie
Himalaya Garg

21

Microsoft.Owin.Host.SystemWebAby to zrobić, może być konieczne dodanie pakietu NuGet :

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

7

W moim przypadku muszę dodać

using Microsoft.AspNet.Identity.Owin;

do rozwiązywania GetOwinContext, a następnie GetUserManager w następnym wierszu.

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


2

Znalezienie prostej odpowiedzi zajęło mi wieczność: ale to, co zrobiłem, to użycie rozszerzenia Get pojedynczego wystąpienia IOwinContext, którego wystąpienie zostało utworzone podczas uruchamiania. Więc wyszło tak:

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

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

2

(Należy pamiętać, że ta odpowiedź dotyczy interfejsu API sieci Web ASP.NET, który odpowiada tagowi użytemu w pytaniu. Zobacz to pytanie, jeśli Twoje zapytanie dotyczy ASP.NET MVC.)

Pytanie nie określa sposobu hostowania usługi ASP.NET Web API . Okno dialogowe w tym poście wskazuje (wyróżnienie moje):

kichalla napisał 24 października 2014 o 1:35

Jeśli NIE korzystasz z własnego hostingu, nie używaj pakietu Microsoft.AspNet.WebApi.Owin z usługami IIS ... ten pakiet powinien być używany tylko do samodzielnego hostingu .

Microsoft.AspNet.WebApi.OwinW zaakceptowanej odpowiedzi zaleca się użycie pakietu . W tej odpowiedzi zgłaszam, co zadziałało podczas hostowania usługi ASP.NET Web API w IIS .

Najpierw zainstaluj następujący pakiet NuGet:

Microsoft.Owin.Host.SystemWeb

Serwer OWIN, który umożliwia uruchamianie aplikacji opartych na OWIN w usługach IIS przy użyciu potoku żądań ASP.NET.

(Pamiętaj, że w trakcie pisania najnowszą dostępną wersją tego pakietu NuGet jest 3.1.0 . Ponadto, w zakresie, w jakim może to mieć znaczenie, używam Visual Studio 2013 Update 5).

Po zainstalowaniu tego pakietu NuGet możesz wykonać następujące czynności:

using Microsoft.Owin;
using System.Web;

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

Teraz, aby rzucić trochę światła na to, jak rozwiązuje się te stwierdzenia. W programie Visual Studio, jeśli klikniesz prawym przyciskiem myszy GetOwinContextdowolną instrukcję i wybierzesz „Peek Definition”, program Visual Studio wyświetli następujące informacje:

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

Jak widać, w System.Webprzestrzeni nazw istnieją dwie GetOwinContext metody rozszerzające:

  • Jeden w HttpContextklasie i
  • Drugi w HttpRequestklasie.

Ponownie, dla tych, którzy hostują swoją usługę interfejsu API sieci Web w usługach IIS, mam nadzieję, że wyjaśni to wszelkie niejasności dotyczące tego, gdzie GetOwinContextmożna znaleźć definicję w odniesieniu do późnej daty w 2017 r.


1

Metoda GetOwinContext()rozszerzenia nie została znaleziona w wątkach innych niż wątek GUI.

Dlatego uważaj, aby nie wywołać tej funkcji z poziomu żadnej awaitfunkcji ed.


1

Po przejrzeniu domyślnego projektu ASP.NET odkryłem, że muszę uwzględnić to podczas uruchamiania mojej aplikacji:

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

Brakowało mi pakietu: Microsoft.AspNet.WebApi.Owin dla ApiControllers. Mam nadzieję że to pomoże!


1

Miałem ten sam problem i rozwiązałem go metodą prywatną: private IAuthenticationManager AuthenticationManager { get { return HttpContext.Current.GetOwinContext().Authentication; } }

U mnie to zadziałało.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.