Vytvořte mechanismus, který bude přesměrován, pokud se nepřihlásíte pomocí ověřování souborů cookie (ASP.NET Core 3.0)

Stránky aktualizovány :
Datum vytvoření stránky :

Prostředí

Visual Studio
  • Visual Studio Společenství 2019
ASP.NET jádro
3.0 nebo novější

Ověřování souborů cookie lze použít v rozhraní .NET Core 2.2 nebo starší, ale naše tipy obsahují kód speciálně pro rozhraní .NET Core 3.0 a novější.

Zpočátku

ASP.NET Core používá ověřování souborů cookie jako mechanismus ověřování přihlášení. Ověřování souborů cookie si můžete myslet jako něco podobného tradičnímu ověřování pomocí formulářů.

Dalším způsobem, jak ověřit ASP.NET Core je ASP.NET základní identity. Kromě ověřování pomocí formulářů, api ověřování, externí přihlašovací služby, správu hesel a reset, atd. Můžete použít mnoho funkcí. Nicméně, z hlediska jen dělat jednoduchý přihlašovací obrazovku tentokrát, to se stává mechanismus trochu přehnané ověřování V tuto chvíli ho nepoužívám.

V tipech pro ověřování souborů cookie nelze zobrazit nic jiného než přihlašovací obrazovku, pokud se nepřihlásíte. Pokud se pokusíte přejít na jinou obrazovku, budete přesměrováni na přihlašovací obrazovku. Po přihlášení můžete také zobrazit další obrazovky.

Jakmile na přihlašovací obrazovce zadáte své uživatelské jméno a heslo, můžete se přihlásit. Ověřování samotného uživatele je implementováno v dočasné pozici. Vzhledem k tomu, že hlavní implementace ověřování souborů cookie je tentokrát poslední, proces rozhodování, například zda je heslo správné, není zásadní.

V tomto tipu je uveden program spartly. Stáhněte si kompletní program pro kompletní kód.

Vytvoření projektu

Spusťte Visual Studio a vytvořte nový projekt.

image

vyberte ASP.NET Základní webová aplikace.

image

Zadejte libovolný název projektu a umístění projektu.

image

Tentokrát použijeme projekty mvc, ale většina ostatních šablon může být nahrazena.

Chcete-li se uověřovacího ověření uj. Pokud zvolíte jiné ověřování, použijete ASP.NET základní identity.

image

Po vytvoření projektu a ladění se zobrazí obrazovka na obrázku níže. Vytvoříme program založený na této obrazovce.

image

Upravit Startup.cs

Startup.cs přidejte definice požadované pro ověřování souborů cookie. Obory názvů používají:

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;

Ověřování souborů cookie můžete povolit spuštěním metod AddAuthentication a AddCookie. Zadejte CookieAuthenticationDefaults.AuthenticationScheme, pokud není nutné změnit název schématu zejména.

Možnosti metody addauthorization. Pokud zadáte requireAuthenticatedUser v fallbackpolicy, Všechny řadiče mohou mít zásady požadované ověřování použít na akci. Je také užitečné v tom smyslu, že kód je snížena a chyba popisu je zabráněno, pokud je vyžadováno ověření jiné než přihlašovací obrazovka. Pouze přihlašovací obrazovka bude psát kód, který nevyžaduje ověření jednotlivě.

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

Přidejte do aplikace ověřování. Přidejte UseAuthentication(). Umístění popisu je založeno na dokumentaci MSDN. Umístěte před UseAuthorization(). Všechno ostatní zůstává šablonou.

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?}");
  });
}

Vytvoření kontrolora účtu

Vytvořte ovladače a akce, které potřebujete k vytvoření přihlašovací obrazovky. Název řadiče je vytvořen jako AccountController. Je to proto, že ve výchozím nastavení název řadiče a název akce přihlašovací obrazovky jsou určeny jako "~/Account/Login". Pokud chcete změnit tuto cestu, můžete ji změnit pomocí možností metody AddCookie v Startup.cs. Provedeme výchozí nastavení.

image

Prvním krokem je vytvoření strany řadiče. Udělením AllowAnonymous atribut, všechny akce v něm lze provést i v případě, že nejsou ověřeny. To umožňuje přístup pouze k přihlašovací obrazovce bez ověřování.

Atribut AllowAnonymous je nezávislý na ověřování souborů cookie jako na jiném umístění než na přihlašovací obrazovce. Může být také použit na řadiče pouze rozhraní 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
  {
  }
}

Definujte uživatele a hesla, která lze přihlásit. Původně jsem ji uložit do databáze, ale tentokrát uživatel úsudek není hlavním zaměřením Udělám to dočasnou sadou.

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

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

Jedná se o akci pro zobrazení přihlašovací obrazovky. Vraťte zobrazení tak, jak je, protože se zobrazí pouze.

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

Proces ověřování po stisknutí přihlašovacího tlačítka. Pokud se uživatelské jméno a heslo shodují, lze je ověřit.

Následující kód definuje deklarace identity, identity a Pricinpal jako minimální kód potřebný pro ověřování. Volání metody HttpContext.SignInAsync generuje soubor cookie a ověřuje jej.

Pokud jsou vyžadovány další nároky nebo vyprší platnost souborů cookie, přidejte parametry.

Po přihlášení jsme přesměrováni na ~/Home/Index, což vyžaduje ověření.

/// <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");
}

Zadejte proces odhlášení. Soubor cookie můžete odstranit a vrátit do nezaznamenaného stavu voláním metody HttpContext.SignOutAsync.

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

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

Vytvoření zobrazení (přihlašovací formulář) (/Zobrazení/Účet/Login.cshtml)

Vzhledem k tomu, že to nebereme v úvahu, přidejte pole pro zadání uživatelského jména a hesla, jak je znázorněno na obrázku níže, a umístěte tlačítko pro přihlášení. Měli byste také umístit odkaz pro přístup k domovská nebo index bez přihlášení pro účely testování.

Vzhledem k tomu, že je problematické zadat uživatelské jméno a heslo, je nastavena počáteční hodnota.

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>

Vytvořit odkaz pro odhlášení (/Zobrazení/Sdílené/_Layout.cshtml)

Domovská obrazovka nic nezmění, ale na navigačním panelu budete mít odkaz odhlášení. Kromě toho budu také dát odkaz, který přechází na přihlašovací obrazovku bez odhlášení pro testovací účely.

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>
<!-- 中略 -->

Zkontrolovat provoz

Nyní jste dokončili minimální implementaci požadovanou pro ověřování souborů cookie. Zkuste to udělat a uvidíte, jak to funguje. To by mělo změnit chování v závislosti na tom, zda jste přihlášeni nebo ne. Jako jednoduchý příklad, myslím, že můžete vidět následující chování.

Operace Výsledky provozu
Jděte domů bez přihlášení Přesměrování na přihlašovací obrazovku
Přihlášení Přejít na domovskou obrazovku
Odhlaste se z domova a jděte domů bez přihlášení Přesměrování na přihlašovací obrazovku
Neodhlašovat se z domova a neodhlašovat se bez přihlášení Přejít na domovskou obrazovku