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?

Scottie
źródło
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.

Simon C.
źródło
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!)

Obi
źródło
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

user3572087
źródło
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>();
Serj Sagan
źródło
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>();
Muhammad Ramzan
źródło
5

Mam ten problem i pobieram dodatkowy pakiet z nuget, aby rozwiązać mój problem, (uruchom następujące polecenie w konsoli Menedżera pakietów) Install-Package Microsoft.Owin.Host.SystemWeb

hmfarimani
źródło
1
To było również rozwiązanie dla mnie - aplikacja konsolowa Framework 4.6.2
Serexx
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;
        }
    }
bigmike3d
źródło
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.

DavidRR
źródło
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.

AxD
źródło
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);`
drobison
źródło
1

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

D-Go
źródło
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.


źródło
0

Musiałem dodać pakiet Microsoft.AspNet.Identity.Owin

GraehamF
źródło