Vytvorte mechanizmus, ktorý bude presmerovaný, ak sa neprihlásite pomocou autentifikácie súborov cookie (ASP.NET Core 3.0)

Stránka aktualizovaná :
Dátum vytvorenia strany :

Životné prostredie

Visual Studio
  • Visual Studio spoločenstva 2019
ASP.NET Core
3,0 alebo novší

Overenie súborov cookie možno použiť v .NET Core 2,2 alebo staršej, ale naše tipy zahŕňajú kód špeciálne pre .NET Core 3,0 a novší.

Ubytovacom zariadení First

ASP.NET Core používa overovanie súborov cookie ako mechanizmus autentifikácie prihlásenia. Môžete si myslieť, cookie autentifikácie ako niečo podobné tradičné formuláre autentifikácie.

Ďalším spôsobom, ako overiť ASP.NET Core je ASP.NET Core identity. Okrem autentifikácie pomocou formulárov, API autentifikácie, externé prihlasovacie služby, správu hesiel a reset, atď. Môžete použiť veľa funkcií. Avšak, z hľadiska len robiť jednoduchú prihlasovaciu obrazovku tentoraz sa stáva mechanizmom trochu prehnané autentifikáciu Nechcem používať v tejto dobe.

V tipy na overenie súborov cookie, nemôžete zobraziť nič iné ako prihlasovacej obrazovke, ak sa prihlásite. Ak sa pokúsite prejsť na inú obrazovku, budete presmerovaní na prihlasovaciu obrazovku. Môžete tiež vidieť ďalšie obrazovky prihlásením.

Po zadaní mena používateľa a hesla na prihlasovacej obrazovke sa môžete prihlásiť. Overenie samotného používateľa sa vykonáva v dočasnom postavení. Vzhľadom k tomu, že hlavné implementácia cookie autentifikácie je posledný tentoraz, rozsudok proces, ako je to, či heslo je správne, nie je podstatné.

Toto tipy uvádza program spartly. Stiahnite si kompletný program pre celý kód.

Vytvorenie projektu

Spustite Visual Studio a vytvoriť nový projekt.

image

Vyberte položku ASP.net Core Web Application.

image

Zadajte názov projektu a umiestnenie projektu.

image

Tentoraz budeme používať MVC projekty, ale väčšina ostatných šablón môžu byť nahradené.

Ak chcete overovanie, vyberte možnosť bez overenia. Ak zvolíte iné overovanie, budete používať ASP.NET Core identity.

image

Po vytvorení projektu a ladenie, zobrazí sa obrazovka na obrázku nižšie. Vytvoríme program založený na tejto obrazovke.

image

Upraviť Startup.cs

Startup.cs pridať definície potrebné pre overenie súborov cookie. Namespaces použitie:

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;

Overenie súborov cookie môžete povoliť spustením AddAuthentication a AddCookie metódy. Zadajte CookieAuthenticationDefaults. AuthenticationScheme, ak nie je potrebné zmeniť názov schémy, najmä.

Možnosti addauthorization metódy. Ak zadáte RequireAuthenticatedUser v FallbackPolicy, Všetky radiče môžu mať politiku potrebnú na overenie, ktorá sa aplikuje na akciu. To je tiež užitočné v tom zmysle, že kód je znížená a popis chyba je zabránené, ak overovanie je potrebné iné ako prihlasovacej obrazovke. Iba prihlasovacej obrazovke bude písať kód, ktorý nevyžaduje autentifikáciu jednotlivo.

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

Pridajte autentifikáciu do aplikácie. Pridať UseAuthentication (). Umiestnenie popisu je založené na dokumentácii MSDN. Miesto pred UseAuthorization (). Všetko ostatné zostáva šablóna.

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

Vytvorenie AccountController

Vytvorte radiče a akcie, ktoré potrebujete na vytvorenie prihlasovacej obrazovky. Názov radiča sa vytvorí ako AccountController. Je to preto, že v predvolenom nastavení, názov radiča a názov akcie prihlasovacej obrazovky sú určené na "~/Account/Login". Ak chcete zmeniť túto cestu, môžete ju zmeniť s možnosťami AddCookie metódy v Startup.cs. Budeme prechádzať s predvolenými nastaveniami.

image

Prvým krokom je vytvorenie radiča strane. Udelením Allowanonymous atribút, všetky akcie v ňom možno vykonať aj v prípade, že nie sú overené. To umožňuje iba prihlasovacej obrazovke, ktoré majú byť prístupné bez overenia.

Atribút Allowanonymous je nezávislý od overenia súborov cookie ako iného umiestnenia ako prihlasovacej obrazovky. Môže sa použiť aj na radičoch iba 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 používateľov a heslá, ktoré je možné prihlásiť. Pôvodne som ju uložiť do databázy, ale tentoraz užívateľ rozsudok nie je hlavným zameraním Robím to dočasný súbor.

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

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

Toto je akcia na zobrazenie prihlasovacej obrazovky. Vráti zobrazenie tak, ako je to spôsobené iba zobrazením.

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

Proces overenia po stlačení tlačidla prihlásenia. Ak sa meno používateľa a heslo zhodujú, môže byť overený.

Nasledujúci kód definuje nárok, totožnosť a Pricinpal ako minimálny kód potrebný na overenie. Volanie HttpContext. SignInAsync metóda generuje cookie a overuje ju.

Ak sa požadujú ďalšie nároky alebo uplynie platnosť súborov cookie, pridajte parametre.

Po prihlásení sme presmerovaní na stránku ~/Home/Index, ktorá vyžaduje autentifikáciu.

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

Zadajte proces odhlásenia. Súbor cookie môžete odstrániť a vrátiť ho do neprihláseného stavu volaním metódy HttpContext. SignOutAsync.

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

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

Vytvorenie zobrazenia (prihlasovací formulár) (/Views/Account/Login.cshtml)

Vzhľadom k tomu, že nebudeme brať do úvahy, pridajte pole zadať svoje užívateľské meno a heslo, ako je znázornené na obrázku nižšie, a miesto tlačidlo pre prihlásenie. Mali by ste tiež umiestniť odkaz na prístup domov/index bez prihlásenia na testovacie účely.

Pretože je problematické zadať meno používateľa a heslo, počiatočná hodnota je nastavená.

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>

Vytvoriť prepojenie odhlásenia (/Views/Shared/_Layout. cshtml)

Domovská obrazovka sa nič nezmení, ale v navigačnom paneli budete mať odkaz na odhlásenie. Okrem toho budem tiež dať odkaz, ktorý prechody na prihlasovacej obrazovke bez odhlásenia na testovacie úč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>
<!-- 中略 -->

Kontrola prevádzky

Teraz ste dokončili minimálnu implementáciu potrebnú na overenie súborov cookie. Skúste to urobiť a uvidíte, ako to funguje. To by malo zmeniť správanie v závislosti na tom, či ste prihlásený alebo nie. Ako jednoduchý príklad, myslím, že môžete vidieť nasledujúce správanie.

Operácia výsledky operácie
Prejsť domov bez prihlásenia Presmerovanie na prihlasovacej obrazovke
Prihlásiť Prejsť na domovskú obrazovku
Odhlásiť sa z domova a ísť domov bez prihlásenia Presmerovanie na prihlasovacej obrazovke
Nenechajte sa odhlásiť z domova a ísť domov bez prihlásenia Prejsť na domovskú obrazovku