Utwórz mechanizm, który będzie przekierowywany, jeśli nie zalogujesz się przy użyciu uwierzytelniania plików cookie (ASP.NET Core 3.0)

Strona zaktualizowana :
Data utworzenia strony :

Środowiska

Visual Studio
  • Społeczność programu Visual Studio 2019
Rdzeń ASP.NET
3.0 lub nowsze

Uwierzytelnianie za pomocą plików cookie może być używane w .NET Core 2.2 lub starszym, ale nasze wskazówki zawierają kod specjalnie dla platformy .NET Core 3.0 i nowszych.

Na początku

ASP.NET Core używa uwierzytelniania plików cookie jako mechanizmu uwierzytelniania logowania. Uwierzytelnianie plików cookie można potraktować jako coś podobnego do uwierzytelniania tradycyjnych formularzy.

Innym sposobem uwierzytelniania ASP.NET Core jest ASP.NET tożsamość rdzenia. Oprócz uwierzytelniania za pomocą formularzy, uwierzytelniania api, zewnętrznych usług logowania, zarządzania hasłami i resetowania itp. Możesz korzystać z wielu funkcji. Jednak z punktu widzenia po prostu co prosty ekran logowania tym razem, staje się mechanizmem trochę przesadzone uwierzytelniania Nie używam go w tej chwili.

W wskazówkach dotyczących uwierzytelniania plików cookie nie można wyświetlić niczego innego niż ekran logowania, chyba że się zalogujesz. Jeśli spróbujesz przejść do innego ekranu, zostaniesz przekierowany do ekranu logowania. Możesz również zobaczyć inne ekrany, logując się.

Po wprowadzeniu nazwy użytkownika i hasła na ekranie logowania możesz się zalogować. Uwierzytelnianie samego użytkownika jest implementowane w pozycji tymczasowej. Ponieważ główna implementacja uwierzytelniania plików cookie jest do ostatniego tego czasu, proces osądu, na przykład, czy hasło jest poprawne, nie jest niezbędna.

Ta wskazówka zawiera listę programu spartly. Pobierz kompletny program dla pełnego kodu.

Tworzenie projektu

Uruchom program Visual Studio i utwórz nowy projekt.

image

wybierz ASP.NET Core Web Application.

image

Określ dowolną nazwę projektu i lokalizację projektu.

image

Tym razem użyjemy projektów mvc, ale większość innych szablonów można zastąpić.

W przypadku uwierzytelniania wybierz pozycję Brak uwierzytelniania. Jeśli wybierzesz inne uwierzytelnianie, użyjesz ASP.NET tożsamość podstawową.

image

Po utworzeniu projektu i debugowaniu go pojawi się ekran na poniższym rysunku. Stworzymy program oparty na tym ekranie.

image

Edytuj Startup.cs

Startup.cs dodać definicje wymagane do uwierzytelniania plików cookie. Obszary nazw używają:

using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

Uwierzytelnianie plików cookie można włączyć, uruchamiając metody AddAuthentication i AddCookie. Określ CookieAuthenticationDefaults.AuthenticationScheme, jeśli nie trzeba zmieniać nazwę schematu w szczególności.

Opcje metody addautoryzowania. Jeśli określisz RequireAuthenticatedUser w FallbackPolicy, Wszystkie kontrolery mogą mieć zasady wymagane do uwierzytelniania stosowane do akcji. Jest to również przydatne w tym sensie, że kod jest zmniejszona i błąd opisu jest zapobiega, jeśli uwierzytelnianie jest wymagane inne niż ekran logowania. Tylko ekran logowania napisze kod, który nie wymaga uwierzytelniania indywidualnie.

public void ConfigureServices(IServiceCollection services)
{
  services.AddControllersWithViews();
  
  // Cookie による認証スキームを追加する
  services
    .AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie();
  
  services.AddAuthorization(options =>
  {
    // AllowAnonymous 属性が指定されていないすべての Action などに対してユーザー認証が必要となる
    options.FallbackPolicy = new AuthorizationPolicyBuilder()
      .RequireAuthenticatedUser()
      .Build();
  });
}

Dodaj uwierzytelnianie do aplikacji. Dodaj UseAuthentication(). Lokalizacja opisu jest oparta na dokumentacji MSDN. Umieść przed UseAuthorization(). Wszystko inne pozostaje szablonem.

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
  if (env.IsDevelopment())
  {
    app.UseDeveloperExceptionPage();
  }
  else
  {
    app.UseExceptionHandler("/Home/Error");
    // The default HSTS value is 30 days. ...
    app.UseHsts();
  }
  app.UseHttpsRedirection();
  app.UseStaticFiles();
  
  app.UseRouting();
  
  app.UseAuthentication(); // [追加] 認証
  app.UseAuthorization(); // 認可
  
  app.UseEndpoints(endpoints =>
  {
    endpoints.MapControllerRoute(
      name: "default",
      pattern: "{controller=Home}/{action=Index}/{id?}");
  });
}

Tworzenie kontrolera konta

Utwórz kontrolery i akcje potrzebne do utworzenia ekranu logowania. Nazwa kontrolera jest tworzona jako AccountController. Dzieje się tak, ponieważ domyślnie nazwa kontrolera i nazwa akcji ekranu logowania są określane jako "~/Account/Login". Jeśli chcesz zmienić tę ścieżkę, możesz ją zmienić za pomocą opcji AddCookie metody w Startup.cs. Przejdziemy przez ustawienia domyślne.

image

Pierwszym krokiem jest utworzenie strony kontrolera. Przyznając AllowAnonymous atrybut, wszystkie akcje w nim można wykonać, nawet jeśli nie są uwierzytelnione. Dzięki temu dostęp do ekranu logowania można uzyskać tylko bez uwierzytelniania.

Atrybut AllowAnonymous jest niezależny od uwierzytelniania plików cookie jako lokalizacji innej niż ekran logowania. Może być również używany na kontrolerach tylko do api.

using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using System.Security.Claims;
using System.Threading.Tasks;

namespace CookieAuthentication.Controllers
{
  /// <remarks>
  /// <see cref="AllowAnonymous"/> 属性は Cookie 認証していなくてもアクセスできる Action (Controller) であることを示す。
  /// </remarks>
  [AllowAnonymous]
  public class AccountController : Controller
  {
  }
}

Zdefiniuj użytkowników i hasła, które mogą być zalogowane. Pierwotnie zapisać go do bazy danych, ale tym razem wyrok użytkownika nie jest głównym celem Robię to przez tymczasowy zestaw.

/// <summary>仮のユーザーデータベースとする。</summary>
private Dictionary<string, string> UserAccounts { get; set; }

public AccountController()
{
  // 仮のユーザーを登録する
  UserAccounts = new Dictionary<string, string>
  {
    { "user1", "password1" },
    { "user2", "password2" },
  };
}

Jest to akcja, aby wyświetlić ekran logowania. Zwraca widok w taki sposób, w jaki jest wyświetlany tylko dlatego, że jest wyświetlany.

/// <summary>ログイン画面を表示します。</summary>
public IActionResult Login()
{
  return View();
}

Proces uwierzytelniania po naciśnięciu przycisku logowania. Jeśli nazwa użytkownika i hasło są zgodne, można je uwierzytelnić.

Poniższy kod definiuje oświadczenia, tożsamości i Pricinpal jako minimalny kod wymagany do uwierzytelniania. Wywołanie httpContext.SignInAsync metoda generuje plik cookie i uwierzytelnia go.

Jeśli wymagane są dodatkowe oświadczenia lub pliki cookie wygasają, dodaj parametry.

Po zalogowaniu przekierowaliśmy do ~/Home/Index, który wymaga uwierzytelnienia.

/// <summary>ログイン処理を実行します。</summary>
[HttpPost]
public async Task<IActionResult> Login(string userName, string password)
{
  // ユーザーの存在チェックとパスワードチェック (仮実装)
  // 本 Tips は Cookie 認証ができるかどうかの確認であるため入力内容やパスワードの厳密なチェックは行っていません
  if (UserAccounts.TryGetValue(userName, out string getPass) == false || password != getPass)
  {
    return View();
  }

  // サインインに必要なプリンシパルを作る
  var claims = new[] { new Claim(ClaimTypes.Name, userName) };
  var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
  var principal = new ClaimsPrincipal(identity);

  // 認証クッキーをレスポンスに追加
  await HttpContext.SignInAsync(principal);

  // ログインが必要な画面にリダイレクトします
  return RedirectToAction(nameof(HomeController.Index), "Home");
}

Wprowadź proces wylogowywania. Możesz usunąć plik cookie i przywrócić go do stanu niezalogowanego, wywołując metodę HttpContext.SignOutAsync.

/// <summary>ログアウト処理を実行します。</summary>
public async Task<IActionResult> Logout()
{
  // 認証クッキーをレスポンスから削除
  await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);

  // ログイン画面にリダイレクト
  return RedirectToAction(nameof(Login));
}

Tworzenie widoku (formularz logowania) (/Widoki/Konto/Login.cshtml)

Ponieważ nie bierzemy tego pod uwagę, dodaj pole, aby wprowadzić nazwę użytkownika i hasło, jak pokazano na poniższym rysunku, i umieść przycisk, aby się zalogować. Należy również umieścić łącze dostępu do domu/indeksu bez logowania się do celów testowych.

Ponieważ wprowadzenie nazwy użytkownika i hasła jest kłopotliwe, ustawiona jest wartość początkowa.

image

@{
  Layout = null;
}
<!DOCTYPE html>
<html>
<head>
  <meta name="viewport" content="width=device-width" />
  <title>Login</title>
</head>
<body>
  <form method="post">
    <input name="userName" type="text" placeholder="ユーザー名" value="user1" />
    <input name="password" type="password" placeholder="パスワード" value="password1" />
    <button type="submit">ログイン</button>
  </form>
  <p><a asp-controller="Home" asp-action="Index">認証が必要な画面へ直接リンク</a></p>
</body>
</html>

Tworzenie łącza wylogowania (/Widoki/Udostępnione/_Layout.cshtml)

Ekran główny niczego nie zmieni, ale na pasku nawigacyjnym pojawi się łącze wylogowywki. Ponadto, będę również umieścić link, który przechodzi do ekranu logowania bez wylogowania się do celów testowych.

image

<!-- 中略 -->
<div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
  <ul class="navbar-nav flex-grow-1">
    <li class="nav-item">
      <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Index">Home</a>
    </li>
    <li class="nav-item">
      <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
    </li>
    <!-- ここから追加 -->
    <li class="nav-item">
      <a class="nav-link text-dark" asp-controller="Account" asp-action="Logout">Logout</a>
    </li>
    <li class="nav-item">
      <a class="nav-link text-dark" asp-controller="Account" asp-action="Login">ログアウトせずログインへ</a>
    </li>
    <!-- ここまで追加 -->
  </ul>
</div>
<!-- 中略 -->

Sprawdź działanie

Ukończono minimalną implementację wymaganą do uwierzytelniania plików cookie. Spróbuj to zrobić i zobaczyć, jak to działa. Należy zmienić zachowanie w zależności od tego, czy jesteś zalogowany, czy nie. Jako prosty przykład, myślę, że można zobaczyć następujące zachowanie.

Operacja Wyniki operacji
Wracaj do domu bez logowania Przekieruj do ekranu logowania
Logowania Przejdź do ekranu głównego
Wyloguj się z domu i wracaj do domu bez logowania Przekieruj do ekranu logowania
Nie wyloguj się z domu i wracaj do domu bez logowania Przejdź do ekranu głównego