Hozzon létre egy mechanizmust, amely átirányítja, ha nem cookie-hitelesítéssel jelentkezik be (ASP.NET Core 3.0)

Oldal frissítve :
Oldal létrehozásának dátuma :

Környezet

Vizuális stúdió
  • Visual Studio Közösség 2019
ASP.NET Core
3.0 vagy újabb

A cookie-hitelesítés használható a .NET Core 2.2-es vagy korábbi verzióiban, de tippjeink kifejezetten a .NET Core 3.0-s és újabb kódokat tartalmazzák.

Először

ASP.NET Core a cookie-hitelesítést használja bejelentkezési hitelesítési mechanizmusként. A cookie-hitelesítést a hagyományos űrlaphitelesítéshez hasonló nak is gondolhatja.

Egy másik módja annak, hogy hitelesítse ASP.NET Core ASP.NET Core Identity. Amellett, hogy a hitelesítés űrlapok, api hitelesítés, külső bejelentkezési szolgáltatások, jelszó kezelés és reset, stb Számos funkciót használhat. Azonban abból a szempontból, hogy csak így egy egyszerű bejelentkezési képernyő ebben az időben, ez lesz a mechanizmus egy kicsit eltúlzott hitelesítés Én nem használja ebben az időben.

A cookie-hitelesítéstippjeiben csak a bejelentkezési képernyőn jeleníthetmeg mást, ha bejelentkezik. Ha megpróbál egy másik képernyőre lépni, akkor átirányítja a bejelentkezési képernyőre. Más képernyőket is megláthat, ha bejelentkezik.

Miután megadta a felhasználónevét és jelszavát a bejelentkezési képernyőn, bejelentkezhet. Maga a felhasználó hitelesítése ideiglenes en van megvalósítva. Mivel a cookie-hitelesítés fő megvalósítása ez úttal tart, az ítélethozatali folyamat, például az, hogy a jelszó helyes-e, nem elengedhetetlen.

Ez a tippek felsorolja a program spartly. Töltse le a teljes programot a teljes kódhoz.

Projekt létrehozása

Indítsa el a Visual Studio alkalmazást, és hozzon létre egy új projektet.

image

válassza ASP.NET Core webalkalmazás lehetőséget.

image

Adja meg a projekt nevét és helyét.

image

Ezúttal mvc projekteket fogunk használni, de a legtöbb más sablon helyettesíthető.

Hitelesítéshez válassza a Nincs hitelesítés lehetőséget. Ha más hitelesítést választ, ASP.NET Core Identity-t fogja használni.

image

Miután létrehozott egy projektet, és hibakeresést végez, megjelenik az alábbi ábra képernyője. Létrehozunk egy programot ezen a képernyőn.

image

Startup.cs szerkesztése

Startup.cs adja hozzá a cookie-hitelesítéshez szükséges definíciókat. A névterek a következőket használják:

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;

A cookie-k hitelesítését az AddAuthentication és az AddCookie metódusok futtatásával engedélyezheti. Adja meg a CookieAuthenticationDefaults.AuthenticationScheme értéket, ha nem kell módosítania a séma nevét.

Az addauthorization metódus beállításai. Ha a RequireAuthenticatedUser értéket adja meg a FallbackPolicy alkalmazásban, Minden vezérlő rendelkezhet a művelethez hitelesítéshez szükséges házirendalkalmazásával. Az is hasznos abban az értelemben, hogy a kód csökken, és a leírás hiba megakadályozza, ha a hitelesítés szükséges más, mint a bejelentkezési képernyőn. Csak a bejelentkezési képernyő fogja írni a kódot, amely nem igényel hitelesítést külön-külön.

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

Adja hozzá a hitelesítést az alkalmazáshoz. UseAuthentication() hozzáadása. A leírás helye az MSDN dokumentációján alapul. Helyezze a UseAuthorization() elé. Minden más sablon marad.

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

AccountController létrehozása

Hozza létre a bejelentkezési képernyő létrehozásához szükséges vezérlőket és műveleteket. A vezérlő név AccountController néven jön létre. Ennek az az oka, hogy alapértelmezés szerint a bejelentkezési képernyő vezérlőneve és műveletneve "~/Account/Login" lesz. Ha meg szeretné változtatni ezt az elérési utat, módosíthatja az AddCookie módszer beállításaival Startup.cs. Végigcsináljuk az alapértelmezett beállításokat.

image

Az első lépés a vezérlő oldalának létrehozása. Az AllowAnonymous attribútum megadásával az összes művelet akkor is elvégezhető, ha nincsenek hitelesítve. Ez lehetővé teszi, hogy csak a bejelentkezési képernyő hitelesítés nélkül érhető el.

Az AllowAnonymous attribútum független a cookie-hitelesítéstől, mint a bejelentkezési képernyőtől eltérő hely. Csak api-vezérlőkön is használható.

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
  {
  }
}

Adja meg a bejelentkezhető felhasználókat és jelszavakat. Eredetileg én menteni egy adatbázisba, de ezúttal a felhasználói ítélet nem a fő hangsúly Ideiglenesen megcsinálom.

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

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

Ez egy művelet a bejelentkezési képernyő megjelenítéséhez. A nézetet úgy adja vissza, ahogy van, mert csak jelenik meg.

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

Hitelesítési folyamat a bejelentkezési gomb megnyomása után. Ha a felhasználónév és a jelszó egyezik, hitelesíthető.

A következő kód határozza meg a jogcím, identitás, és pricinpal, mint a hitelesítéshez szükséges minimális kód. A HttpContext.SignInAsync metódus hívása létrehoz egy cookie-t, és hitelesíti azt.

Ha további jogcímekre van szükség, vagy a cookie-k lejárnak, adjon hozzá paramétereket.

A bejelentkezés után átirányítottuk a ~/Home/Index-et, amely hitelesítést igényel.

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

Adja meg a kijelentkezési folyamatot. A HttpContext.SignOutAsync metódus meghívásával törölheti a cookie-kat, és visszaküldheti nem naplózott állapotba.

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

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

Nézet (bejelentkezési űrlap) létrehozása (/Nézetek/Fiók/Login.cshtml)

Mivel nem vesszük figyelembe, adjon hozzá egy mezőt a felhasználónevének és jelszavának megadásához, ahogy az az alábbi ábrán is látható, és helyezzen el egy gombot a bejelentkezéshez. A Home/Index elérésére mutató hivatkozást is el kell helyeznie anélkül, hogy tesztelési célból bejelentkezne.

Mivel a felhasználónév és a jelszó megadása problémás, a kezdeti érték be van állítva.

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>

Kijelentkezési hivatkozás létrehozása (/Views/Shared/_Layout.cshtml)

A kezdőképernyő nem változtat semmit, de a navigációs sávon lesz egy kijelentkezési hivatkozás. Ráadásul, én' is tesz egy láncszem amit átmeneti -hoz logika képernyő nélkül kijelentkezik részére vizsgálat cél.

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

Ellenőrzés művelete

Most már befejezte a cookie-hitelesítéshez szükséges minimális implementációt. Próbáld meg csinálni, és hogyan működik. Meg kell változtatni a viselkedést attól függően, hogy be van jelentkezve, vagy sem. Mint egy egyszerű példa, azt hiszem, láthatjuk a következő viselkedést.

Művelet Művelet eredményei
Menjen haza bejelentkezés nélkül Átirányítás a bejelentkezési képernyőre
Logika Ugrás a kezdőképernyőre
Jelentkezzen ki otthonról, és menjen haza bejelentkezés nélkül Átirányítás a bejelentkezési képernyőre
Ne jelentkezzen ki otthonról, és ne menjen haza bejelentkezés nélkül Ugrás a kezdőképernyőre