Autoryzacji możemy dokonać na kilka sposobów. Dziś postaram się sobie jak i Wam wyjaśnić jak działa autentykacja oparta na plikach cookie.
Stwórzcie nowy projekt MVC. Aby włączyć mechanizm autentykacji w pliku startup.cs do metody ConfigureServices dodamy linijkę kodu:
Ok dodaliśmy system autentykacji. Powinniśmy teraz do metody AddAuthentication() przekazać stringa z nazwą schematu jakiego chcemy użyć. W naszym przypadku będzie to „Cookie”, ale ładniej będzie wyglądało o ile skorzystamy z pola statycznego o tak:
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie();o ile teraz uruchomimy aplikację nic się nie zmieni. Dlatego iż jeszcze nie dodaliśmy autentykacji plikami cookie do warstwy pośredniej (middleware pipeline) https://docs.microsoft.com/pl-pl/aspnet/core/fundamentals/middleware/?view=aspnetcore-2.1.
Dodajemy warstwę autentykacji tuż nad metodą app.UseMvc(). Ma to znaczenie w którym miejscu to zrobimy z linku powyżej dowiecie się dlaczego jak zrozumiecie działanie middleware pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { (...) app.UseAuthentication(); app.UseMvc(routes => ... (...) }Tym razem też nic się nie zmieni dlatego iż nie dodaliśmy możliwości zalogowania się użytkownika. Zrobimy to teraz dodając prosty formularz do widoku index.cshtml:
<div> <p>Enter the login </p> <form method="post" asp-action="Login"> <label for="name">Name</label> <input type="text" id="name" name="name"></input> <button type="submit">Login in</button> </form> </div>Wasze IDE powinno podkreślić miejsce asp-action="Login" a to dlatego ze formularz odwołuje się do akcji w kontrolerze której jeszcze nie ma. Stwórzmy ją:
[HttpPost] public async Task<IActionResult> Login(string name) { if (string.IsNullOrEmpty(name)) return RedirectToAction("Index"); var identity = new ClaimsIdentity(new [] { new Claim(ClaimTypes.Name, name), }, CookieAuthenticationDefaults.AuthenticationScheme); var principal = new ClaimsPrincipal(identity); await HttpContext.SignInAsync( CookieAuthenticationDefaults.AuthenticationScheme, principal); return RedirectToAction("Index"); }Pierwsze linijki sprawdzają czy użytkownik podał login, następnie musimy stworzyć obiekt który będzie trzymał informacje o użytkowniku. Robi się to używając specjalnego obiektu ClaimsIdentity. Jest to obiekt reprezentujący informacje w strukturze klucz/wartość zwanych Claims’ami.
Następnie wskazuję ze ten szczególny claims jest powiązany ze schematem cookie.
Przekazuję te wszystkie informacje do obiektu ClaimsPrincipal który reprezentuje użytkownika. Mając to wszystko możemy zalogować się do systemu ASP.Net Core wykorzystując HttpContext.SignInAsync()
Dopiszmy jeszcze szybciutko akcje wylogowująca użytkownika:
[HttpPost] public async Task<IActionResult> Logout() { await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme); return RedirectToAction("Index"); }I zmieńmy widok Index.cshtml:
@if (User.Identity.IsAuthenticated) { <div>Hello, @User.Identity.Name!</div> } else { <p>Enter the login </p> <form method="post" asp-action="Login"> <label for="name">Name</label> <input type="text" id="name" name="name"> <button type="submit">Login in</button> </form> }Zaraz po uruchomieniu aplikacji kliknij prawym przyciskiem myszy w dowolne miejsce na stronie i wybierz opcje inspect, zakładka Application / Cookies. Teraz po wpisaniu nazwy użytkownika i kliknięciu zaloguj zobaczy iż stworzy się ciasteczko o nazwie AspNetCore.Cookies
A tak wygląda efekt naszej pracy:
Podsumowanie
Autentykacja plikami cookie jest to prosta metoda zabezpieczenia naszych zasobów. Jest dobra na początek prac nad projektem. Są inne dość łatwe i już bogate w opcje sposoby zabezpieczeń. Postaram się napisać coś o nich.