สร้างกลไกการเข้าสู่ระบบโดยใช้การตรวจสอบสิทธิ์คุกกี้ และสร้างกลไกที่จะเปลี่ยนเส้นทางหากคุณไม่ได้รับการตรวจสอบสิทธิ์

ปรับปรุงหน้า :
วันที่สร้างเพจ :

สภาพแวดล้อมในการทํางาน

วิชวลสตูดิโอ
  • ชุมชน Visual Studio 2022
ASP.NET Core (MVC, หน้ามีดโกน)
6.0

ทีแรก

ในครั้งนี้ ASP.NET Core จะใช้การตรวจสอบ คุกกี้เป็นกลไกการตรวจสอบสิทธิ์การเข้าสู่ระบบ คุณสามารถคิดว่าการรับรองความถูกต้องของคุกกี้นั้นคล้ายกับการรับรองความถูกต้องของแบบฟอร์มแบบดั้งเดิม

กลไกการตรวจสอบสิทธิ์อื่นสําหรับ ASP.NET Core คือ ASP.NET Core Identity นอกเหนือจากการรับรองความถูกต้องโดยใช้แบบฟอร์มแล้วยังช่วยให้คุณสามารถตรวจสอบสิทธิ์ด้วย API ใช้บริการเข้าสู่ระบบภายนอกจัดการและรีเซ็ตรหัสผ่าน ฯลฯ คุณสามารถใช้คุณสมบัติมากมาย อย่างไรก็ตาม จากมุมมองของการสร้างหน้าจอเข้าสู่ระบบอย่างง่ายในครั้งนี้ มันจะเป็นกลไกการตรวจสอบสิทธิ์ที่ค่อนข้างเกินจริง เราจะไม่ใช้มันในครั้งนี้

ในเคล็ดลับการตรวจสอบคุกกี้ที่แนะนําในครั้งนี้คุณไม่สามารถแสดงสิ่งอื่นใดนอกจากหน้าจอเข้าสู่ระบบเว้นแต่คุณจะเข้าสู่ระบบ หากคุณพยายามนําทางไปยังหน้าจออื่นคุณจะถูกเปลี่ยนเส้นทางไปยังหน้าจอเข้าสู่ระบบ หากคุณเข้าสู่ระบบ คุณสามารถ view หน้าจออื่น ๆ

ในขณะนี้ คุณสามารถเข้าสู่ระบบได้โดยป้อนชื่อผู้ใช้และรหัสผ่านของคุณบนหน้าจอเข้าสู่ระบบ การรับรองความถูกต้องของผู้ใช้นั้นถูกนําไปใช้เป็นสถานที่ชั่วคราว ในกรณีนี้จุดสนใจหลักคือการใช้งานการรับรองความถูกต้องของคุกกี้ดังนั้นสาระสําคัญของกระบวนการกําหนดเช่นรหัสผ่านถูกต้องหรือไม่จึงไม่ใช่สาระสําคัญ

เคล็ดลับนี้อธิบายเพียงบางส่วนของโปรแกรม สําหรับรหัสที่สมบูรณ์ให้ดาวน์โหลดโปรแกรมที่สมบูรณ์ นอกจากนี้ยังครอบคลุมทั้งเฟรมเวิร์ก MVC และ Razor Pages

สร้างโครงการ

เริ่ม Visual Studio และสร้างโครงการใหม่

สําหรับ Razor Pages ให้เลือก ASP.NET Core Web App หรือสําหรับ MVC ASP.NET ให้เลือก Core Web App (Model-View-Controller)

ระบุชื่อโครงการที่คุณต้องการและตําแหน่งที่ตั้งสําหรับโครงการ

สําหรับประเภทการตรวจสอบสิทธิ์ ให้เลือก "ไม่มี" หากคุณเลือกการรับรองความถูกต้องอื่นๆ คุณจะใช้ข้อมูลประจําตัวหลัก ASP.NET เมื่อคุณตั้งค่าเสร็จแล้วให้คลิกปุ่ม "สร้าง"

หลังจากสร้างโครงการหน้าจอที่แสดงด้านล่างจะปรากฏขึ้นเมื่อมีการดําเนินการดีบัก เราจะสร้างโปรแกรมตามหน้าจอนี้

แก้ไขโปรแกรม.cs (หน้ามีดโกน, MVC ทั่วไป)

เพิ่มคําจํากัดความที่จําเป็นสําหรับการตรวจสอบคุกกี้ใน Program.cs เนมสเปซที่จะเพิ่มมีดังนี้:

using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authorization;

builder.Servicesนี่คือรหัสที่จะเพิ่ม

// === 省略 ===

// 「Razor Pages」のコード
// builder.Services.AddRazorPages();
// 「MVC」のコード
// builder.Services.AddControllersWithViews();

// ※ここから追加

// Cookie による認証スキームを追加する
builder.Services
  .AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
  .AddCookie();

builder.Services.AddAuthorization(options =>
{
  // AllowAnonymous 属性が指定されていないすべての画面、アクションなどに対してユーザー認証が必要となる
  options.FallbackPolicy = new AuthorizationPolicyBuilder()
    .RequireAuthenticatedUser()
    .Build();
});

// ※ここまで追加

var app = builder.Build();

// === 省略 ===

AddAuthenticationAddCookieคุณสามารถเปิดใช้งานการรับรองความถูกต้องของคุกกี้ได้โดยดําเนินการตามเมธอด และ หากคุณไม่ต้องการเปลี่ยนชื่อCookieAuthenticationDefaults.AuthenticationSchemeแบบแผน ให้ระบุ

AddAuthorizationหากคุณoptions.FallbackPolicyRequireAuthenticatedUserระบุสําหรับวิธีการ คุณสามารถใช้นโยบายการตรวจสอบสิทธิ์ที่จําเป็นกับทุกหน้า ผู้ควบคุมทั้งหมด และการดําเนินการทั้งหมด หากคุณต้องการกําหนดให้มีการตรวจสอบสิทธิ์สําหรับสิ่งอื่นนอกเหนือจากหน้าจอเข้าสู่ระบบ เป็นวิธีที่มีประโยชน์ในแง่ของการลดรหัสและป้องกันข้อผิดพลาดในคําอธิบาย คุณจะต้องเขียนรหัสที่ไม่ต้องการการตรวจสอบสิทธิ์สําหรับหน้าจอเข้าสู่ระบบแยกต่างหาก

ต่อไปนี้เป็น app รหัสสําหรับ.

// === 省略 ===

app.UseRouting();

app.UseAuthentication(); // [追加] 認証
app.UseAuthorization(); // 認可

// 「Razor Pages」のコード
// app.MapRazorPages();
// 「MVC」のコード
// app.MapControllerRoute(
//     name: "default",
//     pattern: "{controller=Home}/{action=Index}/{id?}");

// === 省略 ===

เนื่องจากเราต้องการเพิ่มฟังก์ชันการตรวจสอบสิทธิ์ให้กับแอปพลิเคชัน app.UseAuthentication() ตําแหน่งคําอธิบายเป็นไปตามเอกสาร MSDN แอป ใช้การอนุญาต(). นอกจากนั้น มันยังคงเป็นเทมเพลต

โปรแกรมสําหรับโครงการ Razor Pages

สร้างหน้าเข้าสู่ระบบ (Pages/Account/Login.cshtml.cs)

สร้างไฟล์

สร้างหน้าเข้าสู่ระบบ เส้นทางไฟล์ควรสร้างเป็น "/Pages/Account/Login.cshtml" นี่เป็นเพราะเส้นทางการเข้าสู่ระบบเริ่มต้นเป็นเช่นนั้น หากคุณต้องการเปลี่ยนเส้นทางนี้คุณสามารถทําได้Program.csโดยการตั้งค่าอาร์กิวเมนต์ของวิธีการของAddCookie

คุณสามารถสร้างได้โดยการคัดลอกไฟล์อื่นแทนที่จะสร้างจากเมนู แต่ในกรณีนี้ โปรดแก้ไขโปรแกรมให้ถูกต้อง

อนุญาตให้ผู้ใช้เข้าถึงหน้าเข้าสู่ระบบโดยไม่ต้องเข้าสู่ระบบ

Program.cs เนื่องจากหน้าทั้งหมดสามารถเข้าถึงได้เมื่อคุณเข้าสู่ระบบเท่านั้นคุณจึงต้องตั้งค่าเฉพาะหน้าเข้าสู่ระบบเพื่อให้คุณสามารถเข้าถึงได้แม้ว่าคุณจะไม่ได้เข้าสู่ระบบก็ตาม

AllowAnonymous ด้วยการเพิ่มแอตทริบิวต์ หน้าเป้าหมายจะสามารถเข้าถึงได้แม้ว่าจะไม่ได้ตรวจสอบสิทธิ์ก็ตาม AllowAnonymous แอตทริบิวต์อาจถูกใช้ในที่อื่นนอกเหนือจากหน้าจอเข้าสู่ระบบ เช่น การดําเนินการ API ที่ไม่เกี่ยวข้องกับการตรวจสอบสิทธิ์คุกกี้

using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Security.Claims;

namespace AspNetCoreCookieAuthenticationRazorPages.Pages.Account
{
  [AllowAnonymous]
  public class LoginModel : PageModel
  {
  }
}

สร้างตัวแปรเพื่อรับอินพุต

เมื่อคุณเข้าสู่ระบบ คุณประกาศชื่อผู้ใช้ของคุณเพื่อให้สามารถรับค่าเหล่านั้นได้เนื่องจากคุณป้อนรหัสผ่าน

// 省略

[AllowAnonymous]
public class LoginModel : PageModel
{
  /// <summary>ユーザー名。</summary>
  [BindProperty]
  [Required]
  [DisplayName("ユーザー名")]
  public string UserName { get; set; } = "";

  /// <summary>パスワード。</summary>
  [BindProperty]
  [Required]
  [DataType(DataType.Password)]
  [DisplayName("パスワード")]
  public string Password { get; set; } = "";
}

กําหนดชื่อผู้ใช้และรหัสผ่านสําหรับการตรวจสอบการเข้าสู่ระบบ

เดิมทีมันจะถูกเก็บไว้ในฐานข้อมูล ฯลฯ แต่เนื่องจากการตัดสินของผู้ใช้ไม่ใช่จุดสนใจหลักในครั้งนี้ฉันจะทําให้เป็นสถานที่ชั่วคราว

// 省略

[AllowAnonymous]
public class LoginModel : PageModel
{
  // 省略

  /// <summary>仮のユーザーデータベースとする。</summary>
  private Dictionary<string, string> UserAccounts { get; set; } = new Dictionary<string, string>
    {
      { "user1", "password1" },
      { "user2", "password2" },
    };
}

ขั้นตอนการเข้าสู่ระบบ

/// <summary>ログイン処理。</summary>
public async Task<ActionResult> OnPost()
{
  // 入力内容にエラーがある場合は処理を中断してエラー表示
  if (ModelState.IsValid == false) return Page();

  // ユーザーの存在チェックとパスワードチェック (仮実装)
  // 本 Tips は Cookie 認証ができるかどうかの確認であるため入力内容やパスワードの厳密なチェックは行っていません
  if (UserAccounts.TryGetValue(UserName, out string? getPass) == false || Password != getPass)
  {
    ModelState.AddModelError("", "ユーザー名またはパスワードが一致しません。");
    return Page();
  }

  // サインインに必要なプリンシパルを作る
  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 RedirectToPage("/Index");
}

นี่คือกระบวนการตรวจสอบสิทธิ์หลังจากกดปุ่มเข้าสู่ระบบ หากชื่อผู้ใช้และรหัสผ่านตรงกันการรับรองความถูกต้องเป็นไปได้

รหัสที่อธิบายเป็นรหัสขั้นต่ําที่จําเป็นสําหรับการรับรองความถูกต้องClaimClaimsIdentityClaimsPrincipal และ HttpContext.SignInAsyncโดยการเรียกวิธีการคุกกี้จะถูกสร้างขึ้นและรับรองความถูกต้อง

หากจําเป็นต้องมีการอ้างสิทธิ์เพิ่มเติมหรือจําเป็นต้องมีการหมดอายุของคุกกี้พารามิเตอร์เพิ่มเติมจะถูกเพิ่ม

หลังจากเข้าสู่ระบบ คุณจะถูกเปลี่ยนเส้นทางไปยัง ซึ่ง /Index จําเป็นต้องมีการรับรองความถูกต้อง

กระบวนการออกจากระบบ

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

Logout เมื่อเข้าถึงด้วยตัวจัดการ จะถูกประมวลผลเพื่อออกจากระบบ HttpContext.SignOutAsync เมื่อเรียกใช้วิธีการ คุณสามารถลบคุกกี้และกลับสู่สถานะที่คุณไม่ได้เข้าสู่ระบบ

การสร้างมุมมอง

เราไม่คํานึงถึงรูปลักษณ์ภายนอก เพิ่มช่องสําหรับป้อนชื่อผู้ใช้และรหัสผ่านของคุณดังที่แสดงด้านล่าง และวางปุ่มเพื่อเข้าสู่ระบบ คุณควรมีลิงก์สําหรับเข้าถึงโดยไม่ต้องเข้าสู่ระบบเพื่อ /Index ทําการทดสอบ

เนื่องจากการป้อนชื่อผู้ใช้และรหัสผ่านเป็นเรื่องยากจึงตั้งค่าเริ่มต้น

@page
@model AspNetCoreCookieAuthenticationRazorPages.Pages.Account.LoginModel
@{}

<form asp-action="Login">
  <div class="row m-1 g-3">
    <div class="col-sm-6 offset-sm-3">
      <div asp-validation-summary="ModelOnly" class="text-danger"></div>
    </div>
  </div>

  <div class="row m-1 g-3">
    <div class="col-sm-6 offset-sm-3">
      <label asp-for="UserName" class="form-label"></label>
      <input asp-for="UserName" class="form-control" value="user1" />
      <span asp-validation-for="UserName" class="text-danger"></span>
    </div>
  </div>
  <div class="row m-1 g-3">
    <div class="col-sm-6 offset-sm-3">
      <label asp-for="Password" class="form-label"></label>
      <input asp-for="Password" class="form-control" value="password1" />
      <span asp-validation-for="Password" class="text-danger"></span>
    </div>
  </div>
  <div class="row m-1 g-3">
    <div class="col-sm-6 offset-sm-3">
      <button type="submit" class="btn btn-primary">ログイン</button>
    </div>
  </div>
  <div class="row m-1 g-3">
    <div class="col-sm-6 offset-sm-3">
      <a asp-page="/Index">認証が必要な画面へ直接リンク</a>
    </div>
  </div>
</form>

@section Scripts {
  @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
}

สร้างลิงก์ออกจากระบบ (/Pages/Shared/_Layout.cshtml)

เราจะไม่ทําการเปลี่ยนแปลงใดๆ กับหน้าจอหลัก แต่เราจะใส่ลิงก์ออกจากระบบในแถบนําทาง นอกจากนี้ สําหรับการทดสอบ ให้โพสต์ลิงก์ที่นําคุณไปยังหน้าจอเข้าสู่ระบบโดยไม่ต้องออกจากระบบ

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

เพียงเท่านี้สําหรับรหัส Razor Pages

โปรแกรมสําหรับโครงการ MVC

การสร้างรูปแบบการเข้าสู่ระบบ

คุณได้สร้างแบบจําลองเพื่อรับค่าที่ป้อนบนหน้าจอเข้าสู่ระบบ

namespace AspNetCoreCookieAuthenticationMvc.Models
{
  public class LoginModel
  {
    /// <summary>ユーザー名。</summary>
    [Required]
    [DisplayName("ユーザー名")]
    public string UserName { get; set; } = "";

    /// <summary>パスワード。</summary>
    [Required]
    [DataType(DataType.Password)]
    [DisplayName("パスワード")]
    public string Password { get; set; } = "";
  }
}

การสร้าง AccountController

สร้างตัวควบคุมและการดําเนินการที่จําเป็นในการสร้างหน้าจอเข้าสู่ระบบ สร้างชื่อ AccountController คอนโทรลเลอร์เป็น ชื่อคอนโทรลเลอร์และชื่อการดําเนินการบนหน้าจอเข้าสู่ระบบจะถูกตั้งค่าเป็น "~/Account/Login" หากคุณต้องการเปลี่ยนเส้นทางนี้คุณสามารถทําได้ในตัวเลือกของ AddCookie วิธีการใน Program.cs สําหรับตอนนี้เราจะดําเนินการตามการตั้งค่าเริ่มต้น

ก่อนอื่นเรามาสร้างด้านคอนโทรลเลอร์กันก่อน

using AspNetCoreCookieAuthenticationMvc.Models;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.Security.Claims;

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

AllowAnonymous โดยการให้แอตทริบิวต์การดําเนินการทั้งหมดในนั้นสามารถทําได้โดยไม่ต้องตรวจสอบสิทธิ์ สิ่งนี้ทําให้คุณสามารถเข้าถึงเฉพาะหน้าจอเข้าสู่ระบบโดยไม่ต้องตรวจสอบสิทธิ์

AllowAnonymous แอตทริบิวต์อาจใช้ในตัวควบคุมเฉพาะ API ที่ไม่เกี่ยวข้องกับการตรวจสอบสิทธิ์คุกกี้ในที่อื่นนอกเหนือจากหน้าจอเข้าสู่ระบบ

จากนั้นกําหนดผู้ใช้และรหัสผ่านที่สามารถเข้าสู่ระบบได้ เดิมทีมันจะถูกเก็บไว้ในฐานข้อมูล ฯลฯ แต่เนื่องจากการตัดสินของผู้ใช้ไม่ใช่จุดสนใจหลักในครั้งนี้ฉันจะทําให้เป็นสถานที่ชั่วคราว

[AllowAnonymous]
public class AccountController : Controller
{
  /// <summary>仮のユーザーデータベースとする。</summary>
  private Dictionary<string, string> UserAccounts { get; set; } = new Dictionary<string, string>
    {
      { "user1", "password1" },
      { "user2", "password2" },
    };
}

ต่อไปนี้เป็นการดําเนินการที่แสดงหน้าจอเข้าสู่ระบบ เนื่องจากจะแสดงเฉพาะ จึงส่งคืนมุมมองตามที่เป็นอยู่

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

ด้านล่างนี้คือรหัสที่ต้องดําเนินการเมื่อเข้าสู่ระบบ

/// <summary>ログイン処理を実行します。</summary>
[HttpPost]
public async Task<IActionResult> Login(LoginModel model)
{
  // 入力内容にエラーがある場合は処理を中断してエラー表示
  if (ModelState.IsValid == false) return View(model);

  // ユーザーの存在チェックとパスワードチェック (仮実装)
  // 本 Tips は Cookie 認証ができるかどうかの確認であるため入力内容やパスワードの厳密なチェックは行っていません
  if (UserAccounts.TryGetValue(model.UserName, out string? getPass) == false || model.Password != getPass)
  {
    ModelState.AddModelError("", "ユーザー名またはパスワードが一致しません。");
    return View(model);
  }

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

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

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

นี่คือกระบวนการตรวจสอบสิทธิ์หลังจากกดปุ่มเข้าสู่ระบบ หากชื่อผู้ใช้และรหัสผ่านตรงกันการรับรองความถูกต้องเป็นไปได้

รหัสที่อธิบายเป็นรหัสขั้นต่ําที่จําเป็นสําหรับการรับรองความถูกต้องClaimClaimsIdentityClaimsPrincipal และ HttpContext.SignInAsyncโดยการเรียกวิธีการคุกกี้จะถูกสร้างขึ้นและรับรองความถูกต้อง

หากจําเป็นต้องมีการอ้างสิทธิ์เพิ่มเติมหรือจําเป็นต้องมีการหมดอายุของคุกกี้พารามิเตอร์เพิ่มเติมจะถูกเพิ่ม

หลังจากเข้าสู่ระบบ คุณจะถูกเปลี่ยนเส้นทางไปยัง ซึ่ง ~/Home/Index จําเป็นต้องมีการรับรองความถูกต้อง

สุดท้ายกระบวนการออกจากระบบจะถูกเพิ่ม

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

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

HttpContext.SignOutAsync เมื่อเรียกใช้วิธีการ คุณสามารถลบคุกกี้และกลับสู่สถานะที่คุณไม่ได้เข้าสู่ระบบ

สร้างมุมมอง (แบบฟอร์มเข้าสู่ระบบ) (/Views/Account/Login.cshtml)

Login คลิกขวาที่การทํางานเพื่อเพิ่มมุมมอง คุณยังสามารถสร้างได้โดยคัดลอกจากไฟล์อื่น

เราไม่คํานึงถึงรูปลักษณ์ภายนอก เพิ่มช่องสําหรับป้อนชื่อผู้ใช้และรหัสผ่านของคุณดังที่แสดงด้านล่าง และวางปุ่มเพื่อเข้าสู่ระบบ คุณควรมีลิงก์สําหรับเข้าถึงโดยไม่ต้องเข้าสู่ระบบเพื่อ Home/Index ทําการทดสอบ

เนื่องจากการป้อนชื่อผู้ใช้และรหัสผ่านเป็นเรื่องยากจึงตั้งค่าเริ่มต้น

@model LoginModel
@{}

<form asp-action="Login">
  <div class="row m-1 g-3">
    <div class="col-sm-6 offset-sm-3">
      <div asp-validation-summary="ModelOnly" class="text-danger"></div>
    </div>
  </div>

  <div class="row m-1 g-3">
    <div class="col-sm-6 offset-sm-3">
      <label asp-for="UserName" class="form-label"></label>
      <input asp-for="UserName" class="form-control" value="user1" />
      <span asp-validation-for="UserName" class="text-danger"></span>
    </div>
  </div>
  <div class="row m-1 g-3">
    <div class="col-sm-6 offset-sm-3">
      <label asp-for="Password" class="form-label"></label>
      <input asp-for="Password" class="form-control" value="password1" />
      <span asp-validation-for="Password" class="text-danger"></span>
    </div>
  </div>
  <div class="row m-1 g-3">
    <div class="col-sm-6 offset-sm-3">
      <button type="submit" class="btn btn-primary">ログイン</button>
    </div>
  </div>
  <div class="row m-1 g-3">
    <div class="col-sm-6 offset-sm-3">
      <a asp-controller="Home" asp-action="Index">認証が必要な画面へ直接リンク</a>
    </div>
  </div>
</form>

@section Scripts {
  @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
}

สร้างลิงก์ออกจากระบบ (/Views/Shared/_Layout.cshtml)

เราจะไม่ทําการเปลี่ยนแปลงใดๆ กับหน้าจอหลัก แต่เราจะใส่ลิงก์ออกจากระบบในแถบนําทาง นอกจากนี้ สําหรับการทดสอบ ให้โพสต์ลิงก์ที่นําคุณไปยังหน้าจอเข้าสู่ระบบโดยไม่ต้องออกจากระบบ

<!-- 中略 -->
<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">ログアウト</a>
    </li>
    <li class="nav-item">
      <a class="nav-link text-dark" asp-controller="Account" asp-action="Login">ログアウトせずログインへ</a>
    </li>
    <!-- ここまで追加 -->
  </ul>
</div>
<!-- 中略 -->

เพียงเท่านี้สําหรับรหัส MVC

การยืนยันการดําเนินการ

การดําเนินการนี้จะเสร็จสิ้นการดําเนินการตรวจสอบคุกกี้ขั้นต่ําที่จําเป็น ลองเรียกใช้และดูว่ามันทํางานอย่างไร ลักษณะการทํางานควรเปลี่ยนไปขึ้นอยู่กับว่าคุณเข้าสู่ระบบหรือไม่ ตัวอย่างเช่นคุณสามารถดูพฤติกรรมต่อไปนี้

ผลการดําเนินงาน
กลับบ้านโดยไม่ต้องเข้าสู่ระบบ เปลี่ยนเส้นทางไปยังหน้าจอเข้าสู่ระบบ
เข้า สู่ ระบบ ไปที่หน้าจอหลัก
ออกจากระบบบ้านและกลับบ้านโดยไม่ต้องเข้าสู่ระบบ เปลี่ยนเส้นทางไปยังหน้าจอเข้าสู่ระบบ
กลับบ้านโดยไม่ต้องออกจากระบบบ้านและเข้าสู่ระบบ ไปที่หน้าจอหลัก