צור מנגנון לניתוב מחדש אם אינך מתחבר באמצעות אימות קובצי Cookie (ASP.NET Core 3.0)

עודכן דף :
תאריך יצירת דף :

סביבה

ויז סטודיו
  • הקהילה של Visual Studio 2019
ASP.NET ליבה
3.0 או גירסה מאוחרת יותר

ניתן להשתמש באימות עוגיות ב-.NET Core 2.2 או בגירסה מוקדמת יותר, אך העצות שלנו כוללות קוד במיוחד עבור .NET Core 3.0 ואילך.

. בהתחלה

ASP.NET Core משתמשת באימות קבצי cookie כמנגנון אימות כניסה. באפשרותך לחשוב על אימות קבצי cookie כמשהו דומה לאימות טפסים מסורתיים.

דרך נוספת לאמת את ASP.NET Core היא זהות ליבה ASP.NET. בנוסף לאימות באמצעות טפסים, אימות api, שירותי כניסה חיצוניים, ניהול סיסמאות ואיפוס וכו '. . אתה יכול להשתמש בהרבה פונקציות עם זאת, מנקודת המבט של רק ביצוע מסך כניסה פשוטה הפעם, זה הופך להיות מנגנון של אימות מוגזם מעט . אני לא משתמש בו כרגע

בעצות לאימות קבצי cookie, אין באפשרותך להציג דבר אחר מאשר מסך הכניסה, אלא אם כן אתה מתחבר. אם תנסה לעבור למסך אחר, תועבר אל מסך הכניסה. באפשרותך גם לראות מסכים אחרים על-ידי כניסה.

לאחר הזנת שם המשתמש והסיסמה שלך במסך ההתחברות, באפשרותך להיכנס. אימות המשתמש עצמו מיושם במיקום זמני. מאז היישום העיקרי של אימות עוגיות הוא האחרון הפעם, תהליך השיפוט, כגון אם הסיסמה נכונה, הוא לא חיוני.

עצות אלה מפרטת את התוכנית. הורד את התוכנית המלאה עבור הקוד המלא.

צור פרוייקט

הפעל את Visual Studio וצור פרוייקט חדש.

image

בחר ביישום האינטרנט ASP.NET Core.

image

ציין שם פרוייקט ומיקום פרוייקט.

image

הפעם, נשתמש בפרוייקטים של mvc, אך ניתן להחליף את רוב התבניות האחרות.

לצורך אימות, בחר ללא אימות. אם תבחר באימות אחר, תוכל להשתמש בזהות ASP.NET Core.

image

לאחר יצירת פרוייקט ואיתור באגים באתר, יופיע המסך באיור שלהלן. אנו ניצור תוכנית המבוססת על מסך זה.

image

עריכת Startup.cs

Startup.cs מוסיפה את ההגדרות הנדרשות לאימות קבצי cookie. שימוש בטווחי שמות:

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;

באפשרותך להפוך את אימות קבצי ה-cookie לזמין על-ידי הפעלת השיטות של AddAuthentication ו-Addauthentication. ציון ברירות המחדל של אימות. אימות אם אין צורך לשנות את שם הערכה במיוחד.

אפשרויות שיטת ההרשאה ' הוספה '. אם תציין RequireAuthenticatedUser במדיניות FallbackPolicy לכל הבקרים יכולה להיות מדיניות הדרושה לאימות המוחלת על הפעולה. הוא גם שימושי במובן שהקוד מופחת והטעות בתיאור נמנעת אם האימות נדרש מלבד מסך הכניסה. רק מסך ההתחברות ירשום את הקוד שאינו דורש אימות בנפרד.

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

הוסף אימות ליישום. הוסף שימואימות (). מיקום התיאור מבוסס על התיעוד של 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?}");
  });
}

יצירת בקר חשבונות

צור את הבקרים והפעולות שעליך ליצור מסך כניסה. שם הקונטרולר נוצר כבקר חשבונות. הסיבה לכך היא שכברירת מחדל, שם הקונטרולר ושם הפעולה של מסך הכניסה נחושים להיות "~//B/login". אם ברצונך לשנות נתיב זה, באפשרותך לשנותו עם האפשרויות של פעולת השירות AddCookie ב-Startup.cs. נעבור על הגדרות ברירת המחדל.

image

הצעד הראשון הוא ליצור את צד הקונטרולר. על-ידי הענקת התכונה Allowanonymous , ניתן לבצע את כל הפעולות בו גם אם הן לא אומתו. הדבר מאפשר לגשת רק למסך הכניסה ללא אימות.

התכונה Allowanonymous אינה תלויה באימות קבצי cookie כמיקום שאינו מסך הכניסה. ניתן להשתמש בו גם בבקרי 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 יוצרת קובץ cookie ומאמתת אותה.

אם יש צורך בתביעות נוספות או בקבצי cookie, הוסף פרמטרים.

לאחר הכניסה, ניתלנו מחדש ל ~/Home/Index, הדורש אימות.

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

הזן את תהליך התנתקות. באפשרותך למחוק קובץ cookie ולהחזיר אותו למצב שאינו רשום על-ידי קריאה לפעולת השירות HttpContext. סימן.

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

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

יצירת תצוגה (טופס כניסה) (/צפיות/tals.tcsyushpn)

מכיוון שאנחנו לא לוקחים את זה בחשבון, להוסיף שדה להזין שם משתמש וסיסמה, כפי שמוצג באיור להלן, ולמקם לחצן להיכנס. כמו כן, עליך למקם קישור כדי לגשת לבית/אינדקס ללא כניסה למטרות בדיקה.

מאחר שהיא בעייתית להזנת שם המשתמש והסיסמה, הערך ההתחלתי מוגדר.

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>

צור קישור התנתקות (/Views/Shared/_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>
<!-- 中略 -->

פעולת בדיקה

השלמת כעת את ההטמעה המינימלית הדרושה לאימות קבצי cookie. נסה לעשות את זה ולראות איך זה עובד. זה אמור לשנות את ההתנהגות בהתאם אם אתה מחובר או לא. כדוגמה פשוטה, אני חושב שאתה יכול לראות את ההתנהגות הבאה.

操作 תוצאות פעולה
חזור הביתה מבלי להיכנס למערכת נתב מחדש למסך כניסה
כניסה עבור אל מסך הבית
צא מהבית וחזור הביתה מבלי להיכנס למערכת נתב מחדש למסך כניסה
אל תצא מהבית ותחזור הביתה מבלי להיכנס למערכת עבור אל מסך הבית