สร้างกลไกที่จะเปลี่ยนเส้นทางหากคุณไม่ได้เข้าสู่ระบบโดยใช้การตรวจสอบคุกกี้ (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 และสร้างโครงการใหม่

image

เลือกASP.NETโปรแกรมประยุกต์บนเว็บหลัก

image

ระบุชื่อโครงการและที่ตั้งโครงการใดๆ

image

เวลานี้เราจะใช้โครงการ MVC แต่ส่วนใหญ่ของแม่แบบอื่น ๆ สามารถแทน

สําหรับการรับรองความถูกต้อง ให้เลือกไม่มีการรับรองความถูกต้อง ถ้าคุณเลือกการรับรองความถูกต้องอื่น คุณจะใช้ ASP.NETรหัสประจําตัวหลัก

image

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

image

แก้ไข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 เราจะไปผ่านกับการตั้งค่าเริ่มต้น

image

ขั้นตอนแรกคือการสร้างด้านควบคุม โดยการอนุญาตให้แอตทริบิวต์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)

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

เนื่องจากเป็นลําบากในการป้อนชื่อผู้ใช้และรหัสผ่าน

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>

สร้างการเชื่อมโยงออกจากระบบ (/มุมมอง/ใช้ร่วมกัน/_Layout.cshtml)

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

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

ตรวจสอบการดําเนินงาน

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

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