Tożsamość ASP.NET - HttpContext nie ma metody rozszerzenia dla GetOwinContext

384

Pobrałem i pomyślnie uruchomiłem przykładową tożsamość ASP.NET tutaj: https://github.com/rustd/AspnetIdentitySample

Jestem teraz w trakcie wdrażania platformy ASP.NET Identity w moim projekcie i napotkałem problem, który doprowadzał mnie do szaleństwa przez cały dzień ...

GetOwinContext() nie istnieje jako metoda rozszerzenia na moim HttpContext

Implementuję strukturę tożsamości w bibliotece klas. Zainstalowałem wszystkie najnowsze (przedpremierowe) środowisko tożsamości i wszystko - oprócz tego - działa dobrze.

Próbowałem zaimplementować ten sam kod co ten sam kod bezpośredni w moim kontrolerze i znalazłem ten sam problem.

Wyraźnie brakuje mi gdzieś referencji, choć nie mam pojęcia, co ...! ..

Blok kodu, który mnie zabija to:

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

Dodałem odniesienia do następujących - wypróbowałem je zarówno w mojej bibliotece klas, jak i bezpośrednio na kontrolerze, żadne z nich nie działa dla mnie ...

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

... to doprowadza mnie do szału ... jakiś pomysł?

AKTUALIZACJA

Sprawdziłem wersje Identity & OWIN w próbce i upewniłem się, że mam takie same wersje w swoim rozwiązaniu.

Co więcej, jeśli przeszukuję przeglądarkę obiektów na próbce GetOwinContext, mogę znaleźć metodę, jednak kiedy szukam jej w moim rozwiązaniu, nigdzie jej nie ma ... Muszę mieć bibliotekę nieaktualną, ale mogę ' znajdź to!

Darren Wainwright
źródło

Odpowiedzi:

712

ARGH!

Znalazłem ... Nie miałem dodatkowego pakietu, o nazwieMicrosoft.Owin.Host.SystemWeb

Po przeszukaniu i zainstalowaniu działało.

Teraz - nie jestem pewien, czy wszystko przeoczyłem, chociaż nie znalazłem odniesienia do takiej biblioteki lub pakietu podczas przechodzenia przez różne samouczki. Nie został również zainstalowany, gdy zainstalowałem całą platformę tożsamości ... Nie jestem pewien, czy to tylko ja ...

EDYCJA Chociaż jest w Microsoft.Owin.Host.SystemWebzestawie, jest to metoda rozszerzenia w System.Webprzestrzeni nazw, więc musisz mieć odniesienie do pierwszego i być usingdrugim.

Darren Wainwright
źródło
6
Dzięki za zastanowienie się nad tym: korzystam z tego samouczka asp.net/identity/overview/getting-started/... i to jest brakujący krok
Frenchie
23
@tne - dziękuję za komentarz ... chociaż ledwie „biegałem bez celu” - śledziłem samouczek od zaufanego zasobu; z witryny asp.net nie mniej. Nie mieli tego kroku w samouczku (od tego czasu został dodany) - również fakt, że ludzie popierają zarówno tę odpowiedź, jak i oryginalne Q, również wskazuje, że nie tylko ja miałem ten problem.
Darren Wainwright
5
@Darren, wystarczy. (Zdaję sobie sprawę, mogłem sformułowane, że inaczej.)
tne
3
Tylko w celach informacyjnych: nuget.org/packages/Microsoft.Owin.Host.SystemWeb/2.1.0
Chris Bohatka
5
Nie wiem, czy było to spowodowane aktualizacją tego odniesienia, ale musiałem nieco zmienić swoje zadanie na var authenticationManager = HttpContext.Current.GetOwinContext().Authentication;(Obecne uwzględnione tam, gdzie nie było go w pytaniu).
Ortund
177

Uważam, że musisz odwołać się do prądu, HttpContextjeśli jesteś poza kontrolerem. Kontrolery MVC mają podstawowe odniesienie do bieżącego kontekstu. Jednak poza tym musisz jawnie zadeklarować, że chcesz prąduHttpContext

return HttpContext.Current.GetOwinContext().Authentication;

Jeśli chodzi o to, że się nie wyświetla, nowy szablon projektu MVC 5 wykorzystujący kod pokazany powyżej ( IAuthenticationManager) zawiera następujące instrukcje za pomocą instrukcji u góry kontrolera konta:

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;

Komentując każdy z nich, wygląda na GetOwinContext()to, że jest on faktycznie częścią zestawu System.Web.Mvc.

Tommy
źródło
Próbowałem tego i po prostu nie mogę go znaleźć. - Mam na myśli GetOwinContext ().
Darren Wainwright,
2
@Darren - grałem trochę z przykładowym szablonem i może mieć zestaw, którego brakuje. Wygląda na to, że będziesz musiał odwołać System.Web.Mvcsię do projektu klasowego. Po skomentowaniu stało HttpContext.GetOwinContext()się to nieznane (a nie Microsoft.Owin.Securityzgromadzenie)
Tommy
Starałem się, aby działało to również bezpośrednio na kontrolerze - i znów nie mogę go znaleźć.
Darren Wainwright,
19
To mnie potknęło. Jest własnością publiczną HttpContextw Controllerklasie, więc jeśli dziedziczą, że HttpContext.GetOwinContext()działa zgodnie z oczekiwaniami. Jeśli jednak odziedziczysz po nim ApiController, nie ma takiej właściwości. Dlatego HttpContextbędzie odnosił się do klasy, która będzie wymagać użycia Currentdostępu do instancji klasy. Więc jeśli skopiujesz / wkleisz kod z kontrolera do ApiController i zastanawiasz się, dlaczego to nie działa, to jest odpowiedź dla ciebie.
David Miani
„Obecny” był dla mnie gotcha
kliknij Ok
24

Po próbach i błędach porównania instrukcji używania mojego kontrolera i kontrolera szablonu Asp.Net

using System.Web;

Rozwiązałem problem dla mnie. Będziesz także musiał dodać:

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

Aby użyć metody GetUserManager.

Microsoft nie mógł znaleźć sposobu, aby rozwiązać to automatycznie za pomocą kliknięcia prawym przyciskiem myszy i rozwiązać tak, jak inne brakujące instrukcje?

Ronen Festinger
źródło
1
To również działało dla mnie. Miałem już biblioteki tożsamości, ale wydaje się, że potrzebuje System.Web.
SouthShoreAK
1
Najwyraźniej dużo się to poruszało, zarówno w złożeniach, jak i w przestrzeniach nazw. Naprawdę bolesne jest to, że jest to metoda przedłużania. Zaktualizowałem wszystkie moje biblioteki, a ta odpowiedź odzwierciedla to, gdzie jest obecnie.
shannon
ach, będziecie w piekle w nowym kształcie
JustJohn
1
Tak, niestety, metod rozszerzenia nie można rozwiązać automatycznie.
Ronen Festinger
22

W moim przypadku załatwienie problemu za pomocą nuget polegało na dodaniu referencji Microsoft.AspNet.WebApi.Owin .

Słodkie życie
źródło
Tak, zrobiłem to dla mnie w bieżącej najnowszej wersji. Metoda rozszerzenia znajduje się w tym pakiecie, którym jest Assemby System.Web.Http.Owin oraz w przestrzeni nazw System.Net.Http
oatsoda
16

Upewnij się, że zainstalowałeś pakiet nuget Microsoft.AspNet.Identity.Owin. Następnie dodaj System.Net.Httpprzestrzeń nazw.

CodeNotFound
źródło
Ja też to miałem. Okazuje się, że podczas instalowania Tożsamości była zainstalowana inna biblioteka NIE.
Darren Wainwright,
@Darren Dodaj nazwę pakietu. Dziękujemy
Saturn Technologies,
6
@SaturnTechnologies Dla mnie drugim pakietem był Microsoft.Owin.Host.SystemWeb i przestrzeń nazw System.Web
WiSeeker
1
Drugi WiSeeker. Dla mnie to nie pomogło. Sugestia Darrena, aby zainstalować, Microsoft.Owin.Host.SystemWebzałatwiła sprawę.
Max Barraclough,
13

Po prostu używam

HttpContext.Current.GetOwinContext ()

zrobiłem lewę w moim przypadku.

Honza P.
źródło
10

Dla deweloperów otrzymujących ten błąd w Web API Project -

Metoda rozszerzenia GetOwinContext jest zdefiniowana w System.Web.Http.Owindll i potrzebny będzie jeszcze jeden pakiet, tj Microsoft.Owin.Host.SystemWeb. Ten pakiet musi być zainstalowany w twoim projekcie z nuget.

Link do pakietu : Polecenie instalacji pakietu OWIN -

Install-Package Microsoft.AspNet.WebApi.Owin    

Link do pakietu System.web : Polecenie instalacji pakietu -

Install-Package Microsoft.Owin.Host.SystemWeb

Aby rozwiązać ten błąd, musisz dowiedzieć się, dlaczego występuje on w twoim przypadku. Sprawdź krzyżowo poniższe punkty w kodzie -

  1. Musisz mieć odniesienie do Microsoft.AspNet.Identity.Owin;

    using Microsoft.AspNet.Identity.Owin;

  2. Zdefiniuj GetOwinContext()poniżej, HttpContext.Currentjak poniżej -

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

    LUB

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

Kompletny kod, w którym używany jest GetOwinContext () -

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

Przestrzeń nazw używam w pliku kodu, w którym używana jest funkcja GetOwinContext ()

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;

Wystąpił ten błąd podczas przenoszenia kodu z jednego projektu do drugiego.

Heemanshu Bhalla
źródło
4

Aby uzyskać UserManager w API

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

gdzie AppUserManager jest klasą dziedziczącą po UserManager.

Ashraf Maher
źródło
4

Miałem wszystkie prawidłowe pakiety i użytkowanie, ale najpierw musiałem je zbudować, zanim zacznę GetOwinContext()pracować.

Kevin Raffay
źródło
Jak naprawiłeś swoją kompilację, aby działała po raz pierwszy?
Nordes
@Nordes Czasami VS nie buduje się w tle (tzn .: informuje o błędach kompilacji), ale uruchomienie prawdziwej kompilacji (lub częściej czyszczenia, a następnie kompilacji) doprowadzi ją do końca. Prawdopodobnie właśnie tego doświadczył Kevin.
Maverick,
0

Wystarczy zainstalować ten pakiet, a kod będzie działał: => Install-Package Microsoft.Owin.Host.SystemWeb -Version 2.1.0

Ayyaz
źródło