สร้างกลไกการเข้าสู่ระบบโดยใช้การตรวจสอบสิทธิ์คุกกี้ และสร้างกลไกที่จะเปลี่ยนเส้นทางหากคุณไม่ได้รับการตรวจสอบสิทธิ์
สภาพแวดล้อมในการทํางาน
- วิชวลสตูดิโอ
-
- ชุมชน 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();
// === 省略 ===
AddAuthentication
AddCookie
คุณสามารถเปิดใช้งานการรับรองความถูกต้องของคุกกี้ได้โดยดําเนินการตามเมธอด และ
หากคุณไม่ต้องการเปลี่ยนชื่อCookieAuthenticationDefaults.AuthenticationScheme
แบบแผน ให้ระบุ
AddAuthorization
หากคุณoptions.FallbackPolicy
RequireAuthenticatedUser
ระบุสําหรับวิธีการ
คุณสามารถใช้นโยบายการตรวจสอบสิทธิ์ที่จําเป็นกับทุกหน้า ผู้ควบคุมทั้งหมด และการดําเนินการทั้งหมด
หากคุณต้องการกําหนดให้มีการตรวจสอบสิทธิ์สําหรับสิ่งอื่นนอกเหนือจากหน้าจอเข้าสู่ระบบ เป็นวิธีที่มีประโยชน์ในแง่ของการลดรหัสและป้องกันข้อผิดพลาดในคําอธิบาย
คุณจะต้องเขียนรหัสที่ไม่ต้องการการตรวจสอบสิทธิ์สําหรับหน้าจอเข้าสู่ระบบแยกต่างหาก
ต่อไปนี้เป็น 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");
}
นี่คือกระบวนการตรวจสอบสิทธิ์หลังจากกดปุ่มเข้าสู่ระบบ หากชื่อผู้ใช้และรหัสผ่านตรงกันการรับรองความถูกต้องเป็นไปได้
รหัสที่อธิบายเป็นรหัสขั้นต่ําที่จําเป็นสําหรับการรับรองความถูกต้องClaim
ClaimsIdentity
ClaimsPrincipal
และ
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");
}
นี่คือกระบวนการตรวจสอบสิทธิ์หลังจากกดปุ่มเข้าสู่ระบบ หากชื่อผู้ใช้และรหัสผ่านตรงกันการรับรองความถูกต้องเป็นไปได้
รหัสที่อธิบายเป็นรหัสขั้นต่ําที่จําเป็นสําหรับการรับรองความถูกต้องClaim
ClaimsIdentity
ClaimsPrincipal
และ
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
การยืนยันการดําเนินการ
การดําเนินการนี้จะเสร็จสิ้นการดําเนินการตรวจสอบคุกกี้ขั้นต่ําที่จําเป็น ลองเรียกใช้และดูว่ามันทํางานอย่างไร ลักษณะการทํางานควรเปลี่ยนไปขึ้นอยู่กับว่าคุณเข้าสู่ระบบหรือไม่ ตัวอย่างเช่นคุณสามารถดูพฤติกรรมต่อไปนี้
ผลการดําเนินงาน | ⇒ | |
---|---|---|
กลับบ้านโดยไม่ต้องเข้าสู่ระบบ | ⇒ | เปลี่ยนเส้นทางไปยังหน้าจอเข้าสู่ระบบ |
เข้า สู่ ระบบ | ⇒ | ไปที่หน้าจอหลัก |
ออกจากระบบบ้านและกลับบ้านโดยไม่ต้องเข้าสู่ระบบ | ⇒ | เปลี่ยนเส้นทางไปยังหน้าจอเข้าสู่ระบบ |
กลับบ้านโดยไม่ต้องออกจากระบบบ้านและเข้าสู่ระบบ | ⇒ | ไปที่หน้าจอหลัก |