Autentykacja i autoryzacja użytkowników od zawsze były jednymi z bardziej problematycznych kwestii wytwarzania oprogramowania. Jest to do tego stopnia kłopotliwe, że powstały nawet wyspecjalizowane usługi SaaS takie jak Auth0 służące jako Identity as a Service. W dzisiejszym artykule chciałbym wam pokazać, jak w za pomocą kilku linijek kodu uruchomić .NET Core Identity na dokumentowej bazie MongoDB.
Czym jest .NET Core Identity
Zacznijmy od początku - czym w ogóle jest Identity? Microsoft, w oficjalne dokumentacji, przedstawia to następująco:
ASP.NET Core Identity is a membership system which allows you to add login functionality to your application. Users can create an account and login with a user name and password or they can use an external login provider such as Facebook, Google, Microsoft Account, Twitter or others.
Nie przykładając nadmiernie wagi do szczegółów, można to przetłumaczyć następująco: .NET Core Identity to system do zarządzania użytkownikami, pozwalający na tworzenie kont i logowanie się przez kombinację loginu i hasła, lub wykorzystując zewnętrzne serwisy, jak Facebook, Google, Microsoft Account, Twitter.
Prywatnie dodam, że jest to bardzo dojrzały i zaprawiony w bojach kawałek software-u. Nie jeden programista grzebał w kodzie, wyszukując wszelkich pozostawionych niedopatrzeń. Osobiście też pchałem kubek kakałka gdzie trzeba (i nie trzeba). Mechanizm uważam za, tak po ludzku mówiąc, dobry i sprawdzający si. Sam z niego korzystałem przy kilku z moich projektów.
Konfiguracja
Wiedząc, czym jest .NET Core Identity, możemy przejść do podstawowej konfiguracji. Na szczęście, dla wszystkich leniwych programistów (w tym i mnie :)), uruchomienie jest szybkie i niezbyt skomplikowane. Ba, nawet wyrobimy się zanim kakałko zdąży wystygnąć! Tak więc zaczynajmy.
Na pierwszy ogień, jak zawsze w obecnych czasach, idzie instalacja paczek Nuget-a. Dokładnie jednej: "FB.AspNetCore.Identity.MongoDB",odpowiadającej za dodanie customowej implementacji store-a dla .NET Core Identity.
<PackageReference Include="FB.AspNetCore.Identity.MongoDB" Version="2.0.0">
Bardziej dociekliwym pewnie nasuwa się pytanie: No dobra Dante, a czy nie powinniśmy dodać jakiejś paczki dla samego .NET Core Identity? W odpowiedzi przekaże wam mój ulubiony zwrot: "To zależy" :) Jeżeli piszemy aplikację .NET Core MVC, to już mamy ją zaciągniętą za pomocą "Microsoft.AspNetCore.All".
W następnym kroku czas przejść do pliku "appsettings.json" i stworzyć konfigurację połączenia z bazą danych MongoDB. Potrzebujemy do tego connectionString, nazwę bazy danych, nazwę użytkownik i hasło, aby otrzymać dostęp do bazy danych. Wszystko to musi się znaleźć pod kluczem "MongoDBOption". Dla programistów, którzy dopiero zaczynają swoją zabawę z .NET Core, lub po prostu nie są zaznajomieni z "connectionStringiem", spieszę z wyjaśnieniami. Jest to pojedynczy ciąg znaków służący do autoryzacji z bazą danych. Standardowa budowa wygląda następująco: "mongodb://[user:password@]server:port/database". W przypadku braku uruchomionej autoryzacji w bazie danych, fragment dotyczący użytkownika i hasła jest całkowicie opcjonalny. Należy pamiętać, że w produkcyjnych serwisach konieczne jest logowanie do bazy przy użyciu konkretnego użytkownika. Najlepszą praktyką jest nadawanie minimum uprawnień do edycji danych i ani krzty więcej.
Dodatkowo musimy zdefiniować kolekcję, które będą przechowywać użytkowników i ich role. Robimy to za pomocą kluczy, odpowiednio "Users" i "Role".
"MongoDBOption": {
"ConnectionString": "mongodb://user:password@mongo0.mydevil.net:27017/mydb",
"Database": "mydb",
"User": {
"CollectionName": "Users",
"ManageIndicies": true
},
"Role": {
"CollectionName": "Roles",
"ManageIndicies": true
}
}
Dodanie do Serwisów
Po stworzeniu konfiguracji w pliku "appsettings.json" przechodzimy do "Startup.cs. W metodzie dołączamy kod odpowiedzialny za dodanie samego .NET Core Identity oraz definiujemy dla niego store-a w bazie danych MongoDB. W metodzie "ConfigureServices" należy dopisać poniższy kod.
services.AddIdentity<ApplicationUser, MongoIdentityRole>()
.AddDefaultTokenProviders();
services
.Configure<MongoDBOption>(Configuration.GetSection("MongoDBOption"))
.AddMongoDatabase()
.AddMongoDbContext<ApplicationUser, MongoIdentityRole>()
.AddMongoStore<ApplicationUser, MongoIdentityRole>();
W razie wcześniejszego wygenerowania projektu MVC już z .NET Core Identity trzeba koniecznie usunąć kod dodający Identity i definiujący jego store jako bazę SQLite.
Jako wisienka na torcie pozostaje nam tylko zmiana klasy, po której dziedziczy ApplicationUser na MongoIdentityUser i wykasowanie ApplicationDbContex.
public class ApplicationUser : MongoIdentityUser
{
}
Pomijamy ten krok, jeśli w jednej aplikacji będziemy korzystali zarówno z bazy MongoDb jak i jakiejś relacyjnej np. SqlServer.
Podsumowanie
Tak oto doszliśmy do końca tego artykułu. Dosłownie kilka kroków wystarczy, aby uruchomić .NET Core Identity z wykorzystaniem bazy danych MongoDB. Mam nadzieje, że ten tutorial okazał wam się przydatny. Jeżeli chcielibyście, abym poruszył inne kwestię dotyczące samego .NET Core-a, czy MongoDB, to dajcie znać czy to przez komentarze, mail-a, twittera czymkolwiek :)
Jak zawsze, do następnego!
Cześć