Pracuję z aplikacją ASP.NET Core. Próbuję wdrożyć uwierzytelnianie oparte na tokenach, ale nie mogę dowiedzieć się, jak używać nowego systemu zabezpieczeń w mojej sprawie. Przejrzałem przykłady, ale niewiele mi pomogły, używają uwierzytelniania plików cookie lub uwierzytelniania zewnętrznego (GitHub, Microsoft, Twitter).
Jaki jest mój scenariusz: aplikacja angularjs powinna zażądać adresu /token
URL przekazującego nazwę użytkownika i hasło. WebApi powinno autoryzować użytkownika i zwrot, access_token
który będzie używany przez aplikację angularjs w kolejnych żądaniach.
Znalazłem świetny artykuł o wdrażaniu dokładnie tego, czego potrzebuję w aktualnej wersji ASP.NET - uwierzytelnianie oparte na tokenach przy użyciu ASP.NET Web API 2, Owin i Identity . Ale nie jest dla mnie oczywiste, jak zrobić to samo w ASP.NET Core.
Moje pytanie brzmi: jak skonfigurować aplikację ASP.NET Core WebApi do pracy z uwierzytelnianiem opartym na tokenach?
Odpowiedzi:
Aktualizacja dla .Net Core 3.1:
David Fowler (architekt zespołu ASP .NET Core) stworzył niezwykle prosty zestaw aplikacji zadaniowych, w tym prostą aplikację demonstrującą JWT . Wkrótce wprowadzę jego aktualizacje i uproszczony styl do tego postu.
Zaktualizowano dla .Net Core 2:
Poprzednie wersje tej odpowiedzi wykorzystywały RSA; naprawdę nie jest to konieczne, jeśli ten sam kod, który generuje tokeny, również weryfikuje tokeny. Jeśli jednak rozdzielasz odpowiedzialność, prawdopodobnie nadal chcesz to zrobić przy użyciu wystąpienia
Microsoft.IdentityModel.Tokens.RsaSecurityKey
.Utwórz kilka stałych, których będziemy używać później; oto co zrobiłem:
Dodaj to do swojego Startup.cs
ConfigureServices
. Później użyjemy iniekcji zależności, aby uzyskać dostęp do tych ustawień. Zakładam, że twójauthenticationConfiguration
to obiektConfigurationSection
lubConfiguration
taki, że możesz mieć inną konfigurację do debugowania i produkcji. Upewnij się, że przechowujesz klucz w bezpiecznym miejscu! Może to być dowolny ciąg.Widziałem inne odpowiedzi zmieniające inne ustawienia, takie jak
ClockSkew
; wartości domyślne są ustawione tak, że powinno działać w środowiskach rozproszonych, w których zegary nie są dokładnie zsynchronizowane. To jedyne ustawienia, które musisz zmienić.Skonfiguruj uwierzytelnianie. Powinieneś mieć ten wiersz przed jakimkolwiek oprogramowaniem pośredniczącym, które wymaga twoich
User
informacji, takim jakapp.UseMvc()
.Pamiętaj, że nie spowoduje to wyemitowania tokenu z rozszerzeniem
SignInManager
lub czymkolwiek innym. Będziesz musiał zapewnić własny mechanizm wyprowadzania tokenów JWT - patrz poniżej.Możesz chcieć określić
AuthorizationPolicy
. Umożliwi to określenie kontrolerów i akcji, które zezwalają tylko na tokeny okaziciela jako uwierzytelnianie przy użyciu[Authorize("Bearer")]
.Oto trudna część: zbudowanie tokena.
Następnie w kontrolerze, w którym chcesz mieć swój token, na przykład:
Tutaj zakładam, że masz już dyrektora. Jeśli używasz tożsamości, możesz użyć,
IUserClaimsPrincipalFactory<>
aby przekształcić swójUser
plik wClaimsPrincipal
.By to sprawdzić : Get token, umieścić go w formularzu na jwt.io . Instrukcje, które podałem powyżej, pozwalają również na użycie sekretu z konfiguracji do weryfikacji podpisu!
Jeśli renderowałeś to w częściowym widoku na swojej stronie HTML w połączeniu z uwierzytelnianiem tylko na okaziciela w .Net 4.5, możesz teraz użyć a,
ViewComponent
aby zrobić to samo. Jest w większości taki sam jak powyższy kod akcji kontrolera.źródło
IOptions<OAuthBearerAuthenticationOptions>
aby użyć opcji; używanie obiektu Options bezpośrednio nie jest obsługiwane ze względu na nazwaną konfigurację obsługiwaną przez strukturę modelu opcji.Praca z bajecznym odpowiedź Matt Dekrey za , I utworzeniu przykład pełni funkcjonalny uwierzytelniania tokenów, działa przeciwko ASP.NET rdzeń (1.0.1). Możesz znaleźć pełny kod w tym repozytorium na GitHub (alternatywne gałęzie dla 1.0.0-rc1 , beta8 , beta7 ), ale w skrócie, ważne kroki to:
Wygeneruj klucz dla swojej aplikacji
W moim przykładzie generuję losowy klucz za każdym razem, gdy aplikacja się uruchamia, musisz go wygenerować i gdzieś przechowywać i dostarczyć do swojej aplikacji. Zobacz ten plik, aby dowiedzieć się, jak generuję klucz losowy i jak możesz go zaimportować z pliku .json . Jak zasugerował w komentarzach @kspearrin, API ochrony danych wydaje się idealnym kandydatem do „prawidłowego” zarządzania kluczami, ale nie doszedłem jeszcze do wniosku, czy to możliwe. Prześlij żądanie ściągnięcia, jeśli to rozwiązujesz!
Startup.cs - ConfigureServices
Tutaj musimy załadować klucz prywatny do podpisania naszych tokenów, którego użyjemy również do weryfikacji tokenów, gdy są prezentowane. Przechowujemy klucz w zmiennej na poziomie klasy,
key
której użyjemy ponownie w poniższej metodzie Configure. TokenAuthOptions to prosta klasa, która przechowuje tożsamość podpisu, odbiorców i wystawcę, których będziemy potrzebować w kontrolerze TokenController do tworzenia naszych kluczy.Skonfigurowaliśmy również zasady autoryzacji, aby umożliwić nam używanie
[Authorize("Bearer")]
na punktach końcowych i klasach, które chcemy chronić.Startup.cs - Skonfiguruj
Tutaj musimy skonfigurować JwtBearerAuthentication:
TokenController
W kontrolerze tokenów musisz mieć metodę generowania podpisanych kluczy przy użyciu klucza załadowanego w Startup.cs. Zarejestrowaliśmy wystąpienie TokenAuthOptions w Startup, więc musimy wstrzyknąć to w konstruktorze dla TokenController:
Następnie musisz wygenerować token w programie obsługi dla punktu końcowego logowania, w moim przykładzie biorę nazwę użytkownika i hasło i sprawdzam je za pomocą instrukcji if, ale kluczową rzeczą, którą musisz zrobić, jest utworzenie lub załadowanie oświadczeń opartą na tożsamości i wygeneruj w tym celu token:
I to powinno być to. Po prostu dodaj
[Authorize("Bearer")]
do dowolnej metody lub klasy, którą chcesz chronić, a przy próbie uzyskania do niej dostępu bez tokena powinien pojawić się błąd. Jeśli chcesz zwrócić błąd 401 zamiast błędu 500, musisz zarejestrować niestandardową procedurę obsługi wyjątków, tak jak w moim przykładzie tutaj .źródło
Możesz rzucić okiem na przykłady OpenId connect, które ilustrują, jak radzić sobie z różnymi mechanizmami uwierzytelniania, w tym tokenami JWT:
https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Samples
Jeśli spojrzysz na projekt Cordova Backend, konfiguracja interfejsu API wygląda następująco:
Warto też przyjrzeć się logice w /Providers/AuthorizationProvider.cs i RessourceController tego projektu;).
Alternatywnie możesz również użyć następującego kodu do weryfikacji tokenów (istnieje również fragment kodu, aby działał z signalR):
Do wystawienia tokena możesz użyć pakietów serwerowych openId Connect w następujący sposób:
EDYCJA: Zaimplementowałem aplikację jednostronicową z implementacją uwierzytelniania opartą na tokenach przy użyciu frameworka Aurelia i rdzenia ASP.NET. Istnieje również trwałe połączenie sygnału R. Jednak nie wykonałem żadnej implementacji DB. Kod można zobaczyć tutaj: https://github.com/alexandre-spieser/AureliaAspNetCoreAuth
Mam nadzieję że to pomoże,
Najlepsza,
Alex
źródło
Spójrz na OpenIddict - to nowy projekt (w momencie pisania), który ułatwia konfigurację tworzenia tokenów JWT i tokenów odświeżania w ASP.NET 5. Walidacja tokenów jest obsługiwana przez inne oprogramowanie.
Zakładając, że używasz
Identity
withEntity Framework
, ostatnia linia jest tym, co dodasz do swojejConfigureServices
metody:W programie
Configure
konfigurujesz OpenIddict do obsługi tokenów JWT:Konfigurujesz również walidację tokenów w
Configure
:Jest jeszcze jedna lub dwie inne pomniejsze rzeczy, takie jak DbContext musi pochodzić z OpenIddictContext.
Pełne wyjaśnienie można znaleźć w tym poście na blogu: http://capesean.co.za/blog/asp-net-5-jwt-tokens/
Funkcjonujące demo jest dostępne pod adresem : https://github.com/capesean/openiddict-test
źródło