สร้างกลไกที่จะเปลี่ยนเส้นทางหากคุณไม่ได้เข้าสู่ระบบโดยใช้การตรวจสอบคุกกี้ (ASP.NET Core 3.0)
สภาพ แวด ล้อม
- สตูดิโอภาพ
-
- ชุมชนสตูดิโอภาพ 2019
- แกนASP.NET
- 3.0 หรือใหม่กว่า
การรับรองความถูกต้องของคุกกี้สามารถใช้ใน .NET Core 2.2 หรือก่อนหน้า แต่เคล็ดลับของเรารวมรหัสเฉพาะสําหรับ.NET Core 3.0 และรุ่นที่ใหม่กว่า
ในตอนแรก
ASP.NET Core ใช้การตรวจสอบความถูกต้องของคุกกี้เป็นกลไกการตรวจสอบความถูกต้องของการเข้าสู่ระบบ คุณสามารถคิดของการตรวจสอบคุกกี้เป็นสิ่งที่คล้ายกับการตรวจสอบรูปแบบแบบดั้งเดิม
อีกวิธีหนึ่งในการตรวจสอบความถูกต้องASP.NET Core คือASP.NETเอกลักษณ์หลัก นอกจากการรับรองความถูกต้องโดยใช้แบบฟอร์มการตรวจสอบ API บริการเข้าสู่ระบบภายนอกการจัดการรหัสผ่านและการตั้งค่าเป็นต้น คุณสามารถใช้ฟังก์ชันมากมาย อย่างไรก็ตามจากมุมมองของเพียงแค่ทําให้หน้าจอเข้าสู่ระบบง่ายในครั้งนี้มันจะกลายเป็นกลไกของการตรวจสอบที่โอ้อวดเล็กน้อย ฉันไม่ได้ใช้มันในเวลานี้
ในเคล็ดลับในการตรวจสอบคุกกี้, คุณไม่สามารถแสดงอะไรอื่นนอกเหนือจากหน้าจอเข้าสู่ระบบจนกว่าคุณจะเข้าสู่ระบบ. หากคุณพยายามที่จะไปที่หน้าจออื่นคุณจะถูกเปลี่ยนเส้นทางไปยังหน้าจอเข้าสู่ระบบ คุณยังสามารถดูหน้าจออื่น ๆ โดยการเข้าสู่ระบบ
เมื่อคุณป้อนชื่อผู้ใช้และรหัสผ่านของคุณบนหน้าจอเข้าสู่ระบบคุณสามารถเข้าสู่ระบบ การรับรองความถูกต้องของผู้ใช้เองจะดําเนินการในตําแหน่งชั่วคราว ตั้งแต่การดําเนินการหลักของการตรวจสอบคุกกี้เป็นครั้งสุดท้ายในครั้งนี้กระบวนการตัดสินเช่นว่ารหัสผ่านที่ถูกต้องไม่จําเป็น
เคล็ดลับนี้แสดงรายการโปรแกรม spartly ดาวน์โหลดโปรแกรมที่สมบูรณ์สําหรับรหัสที่สมบูรณ์
สร้างโครงการ
เริ่มการทํางานของ Visual Studio และสร้างโครงการใหม่
เลือกASP.NETโปรแกรมประยุกต์บนเว็บหลัก
ระบุชื่อโครงการและที่ตั้งโครงการใดๆ
เวลานี้เราจะใช้โครงการ MVC แต่ส่วนใหญ่ของแม่แบบอื่น ๆ สามารถแทน
สําหรับการรับรองความถูกต้อง ให้เลือกไม่มีการรับรองความถูกต้อง ถ้าคุณเลือกการรับรองความถูกต้องอื่น คุณจะใช้ ASP.NETรหัสประจําตัวหลัก
หลังจากที่คุณสร้างโครงการ และดีบักนั้น หน้าจอในรูปด้านล่างจะปรากฏขึ้น เราจะสร้างโปรแกรมตามหน้าจอนี้
แก้ไขStartup.cs
Startup.csเพิ่มข้อกําหนดที่จําเป็นสําหรับการรับรองความถูกต้องของคุกกี้ ใช้ Namespaces:
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;
คุณสามารถเปิดใช้งานการรับรองความถูกต้องของคุกกี้โดยการเรียกใช้วิธีการAddAuthenticationและAddCookie ระบุ CookieAuthenticationDefaults.AuthenticationScheme ถ้าคุณไม่จําเป็นต้องเปลี่ยนชื่อโครงร่างโดยเฉพาะอย่างยิ่ง
ตัวเลือกวิธีการเพิ่มการตรวจสอบ ถ้าคุณระบุRequireAuthenticatedผู้ใช้ในนโยบายย้อนกลับ ตัวควบคุมทั้งหมดสามารถมีนโยบายที่ต้องใช้การรับรองความถูกต้องที่นําไปใช้กับการดําเนินการ นอกจากนี้ยังเป็นประโยชน์ในแง่ที่ว่ารหัสจะลดลงและความผิดพลาดคําอธิบายจะถูกป้องกันหากจําเป็นต้องมีการตรวจสอบความถูกต้องอื่นนอกเหนือจากหน้าจอเข้าสู่ระบบ เฉพาะหน้าจอเข้าสู่ระบบเท่านั้นที่จะเขียนรหัสที่ไม่จําเป็นต้องตรวจสอบเป็นรายบุคคล
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
// Cookie による認証スキームを追加する
services
.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie();
services.AddAuthorization(options =>
{
// AllowAnonymous 属性が指定されていないすべての Action などに対してユーザー認証が必要となる
options.FallbackPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
});
}
เพิ่มการรับรองความถูกต้องลงในแอปพลิเคชันของคุณ เพิ่ม UseAuthentication() ตําแหน่งที่ตั้งคําอธิบายจะขึ้นอยู่กับเอกสารประกอบของ MSDN สถานที่ในด้านหน้าของการใช้การตรวจสอบ() ทุกสิ่งทุกอย่างยังคงเป็นแม่แบบ
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?}");
});
}
การสร้างตัวควบคุมลูกค้าองค์กร
สร้างตัวควบคุมและการดําเนินการที่คุณต้องการสร้างหน้าจอเข้าสู่ระบบ ชื่อตัวควบคุมถูกสร้างเป็นตัวควบคุมบัญชี ชื่อตัวควบคุมและชื่อการกระทําของหน้าจอล็อกอินจะถูกกําหนดเป็น "~/บัญชี/ล็อกอิน" ถ้าคุณต้องการเปลี่ยนเส้นทางนี้ คุณสามารถเปลี่ยนด้วยตัวเลือกของวิธีการ AddCookie ในStartup.cs เราจะไปผ่านกับการตั้งค่าเริ่มต้น
ขั้นตอนแรกคือการสร้างด้านควบคุม โดยการอนุญาตให้แอตทริบิวต์AllowAnonymousการดําเนินการทั้งหมดในนั้นสามารถดําเนินการได้แม้ว่าพวกเขาจะไม่รับรองความถูกต้อง ซึ่งช่วยให้สามารถเข้าถึงหน้าจอการเข้าสู่ระบบได้โดยไม่มีการรับรองความถูกต้องเท่านั้น
กระบวนการAllowAnonymousแอตทริบิวต์เป็นอิสระจากการตรวจสอบความถูกต้องของคุกกี้เป็นตําแหน่งที่ตั้งอื่นนอกเหนือจากหน้าจอเข้าสู่ระบบ นอกจากนี้ยังอาจใช้ในตัวควบคุม 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
{
}
}
กําหนดผู้ใช้และรหัสผ่านที่สามารถเข้าสู่ระบบได้ แต่เดิมฉันบันทึกไปยังฐานข้อมูล แต่เวลานี้ตัดสินผู้ใช้ไม่ได้มุ่งเน้นหลัก ฉันทําให้มันโดยชุดชั่วคราว
<summary>仮のユーザーデータベースとする。</summary>
private Dictionary<string, string> UserAccounts { get; set; }
public AccountController()
{
// 仮のユーザーを登録する
UserAccounts = new Dictionary<string, string>
{
{ "user1", "password1" },
{ "user2", "password2" },
};
}
นี่คือการกระทําที่จะแสดงหน้าจอเข้าสู่ระบบ กลับมุมมองตามที่มันเป็นเพราะมันแสดงเท่านั้น
<summary>ログイン画面を表示します。</summary>
public IActionResult Login()
{
return View();
}
กระบวนการตรวจสอบสิทธิ์หลังจากกดปุ่มเข้าสู่ระบบ ถ้าชื่อผู้ใช้และรหัสผ่านตรงกัน ก็สามารถรับรองความถูกต้อง
รหัสต่อไปนี้กําหนดการเรียกร้อง, เอกลักษณ์, และ Pricinpal เป็นรหัสขั้นต่ําที่จําเป็นสําหรับการตรวจสอบ. การเรียกวิธีการHttpContext.SignInAsyncสร้างคุกกี้ และการรับรองความถูกต้องนั้น
หากจําเป็นต้องมีการเรียกร้องเพิ่มเติมหรือคุกกี้หมดอายุให้เพิ่มพารามิเตอร์
หลังจากเข้าสู่ระบบเราได้เปลี่ยนเส้นทางไป ~ / หน้าแรก / ดัชนีซึ่งต้องมีการตรวจสอบ
<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");
}
ป้อนกระบวนการออกจากระบบ คุณสามารถลบคุกกี้ และกลับไปยังสถานะ unlogged โดยการเรียกวิธีการHttpContext.SignOutAsync
<summary>ログアウト処理を実行します。</summary>
public async Task<IActionResult> Logout()
{
// 認証クッキーをレスポンスから削除
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
// ログイン画面にリダイレクト
return RedirectToAction(nameof(Login));
}
การสร้างมุมมอง (แบบฟอร์มการเข้าสู่ระบบ) (/มุมมอง/บัญชี/Login.cshtml)
เนื่องจากเราไม่ได้คํานึงถึงให้เพิ่มเขตข้อมูลเพื่อป้อนชื่อผู้ใช้และรหัสผ่านของคุณดังที่แสดงในรูปด้านล่างและวางปุ่มเพื่อเข้าสู่ระบบ นอกจากนี้คุณควรวางลิงก์เพื่อเข้าถึงหน้าแรก/ดัชนีโดยไม่ต้องเข้าสู่ระบบเพื่อวัตถุประสงค์ในการทดสอบ
เนื่องจากเป็นลําบากในการป้อนชื่อผู้ใช้และรหัสผ่าน
@{
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>
สร้างการเชื่อมโยงออกจากระบบ (/มุมมอง/ใช้ร่วมกัน/_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">Logout</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-controller="Account" asp-action="Login">ログアウトせずログインへ</a>
</li>
<!-- ここまで追加 -->
</ul>
</div>
<!-- 中略 -->
ตรวจสอบการดําเนินงาน
ขณะนี้คุณได้ดําเนินการขั้นต่ําที่จําเป็นสําหรับการตรวจสอบความถูกต้องของคุกกี้ พยายามที่จะทํามันและดูวิธีการทํางาน มันควรเปลี่ยนลักษณะการทํางานขึ้นอยู่กับว่าคุณเข้าสู่ระบบหรือไม่ เป็นตัวอย่างง่ายๆผมคิดว่าคุณสามารถดูพฤติกรรมต่อไปนี้
การดําเนินงาน | ⇒ | ผลการดําเนินงาน |
---|---|---|
กลับบ้านโดยไม่ต้องเข้าสู่ระบบ | ⇒ | เปลี่ยนเส้นทางไปยังหน้าจอเข้าสู่ระบบ |
เข้า สู่ ระบบ | ⇒ | ไปที่หน้าจอหลัก |
ออกจากระบบที่บ้านและกลับบ้านโดยไม่ต้องเข้าสู่ระบบ | ⇒ | เปลี่ยนเส้นทางไปยังหน้าจอเข้าสู่ระบบ |
อย่าออกจากระบบที่บ้านและกลับบ้านโดยไม่ต้องเข้าสู่ระบบ | ⇒ | ไปที่หน้าจอหลัก |