اگر با استفاده از احراز هویت کوکی وارد سیستم نشوید ، مکانیزمی برای هدایت مجدد ایجاد کنید (ASP.NET Core 3.0)

صفحه به روز شده :
تاریخ ایجاد صفحه :

محیط

ویژوال استودیو
  • ویژوال استودیو انجمن ۲۰۱۹
ASP.NET هسته
۳/۰ یا بالاتر

احراز هویت کوکی را می توان در .NET Core ۲/۲ یا قبل از آن استفاده کرد ، اما راهنمایی های ما شامل کد به طور خاص برای .NET Core ۳/۰ و بعد از آن است.

در ابتدا

ASP.NET Core از احراز هویت کوکی به عنوان مکانیزم تأیید اعتبار ورود استفاده می کند. شما می توانید از احراز هویت کوکی به عنوان چیزی شبیه به اعتبار اشکال سنتی فکر می کنم.

یکی دیگر از راه های احراز هویت ASP.NET هسته ASP.NET هویت اصلی است. علاوه بر احراز هویت با استفاده از فرم, احراز هویت api, خدمات ورود به سیستم خارجی, مدیریت رمز عبور و تنظیم مجدد, غیره. شما می توانید بسیاری از توابع استفاده کنید. با این حال ، از نقطه نظر فقط ساخت یک صفحه ورود ساده در این زمان ، آن را تبدیل به یک مکانیسم احراز هویت کمی اغراق آمیز من آن را در این زمان استفاده کنید.

در راهنمایی برای احراز هویت کوکی ، شما می توانید هر چیزی به غیر از صفحه ورود به سیستم نشان نمی دهد مگر اینکه شما وارد شوید. اگر سعی می کنید به یک صفحه دیگر بروید ، به صفحه ورود به سیستم هدایت می شوید. همچنین می توانید با ورود به سیستم ، صفحه های دیگر را ببینید.

هنگامی که نام کاربری و رمز عبور خود را وارد کنید در صفحه ورود به سیستم ، شما می توانید وارد شوید. احراز هویت کاربر خود را در یک موقعیت موقت اجرا. از آنجا که اجرای اصلی احراز هویت کوکی این است که آخرین بار ، روند قضاوت ، مانند اینکه آیا رمز عبور درست است ، ضروری نیست.

این راهنمایی لیست برنامه spartly. دانلود برنامه کامل برای کد کامل.

ایجاد یک پروژه

شروع ویژوال استودیو و ایجاد یک پروژه جدید.

image

برنامه کاربردی وب ASP.NET Core را انتخاب کنید.

image

هر نام پروژه و محل پروژه را مشخص کنید.

image

این بار ، خواهیم پروژه های mvc استفاده کنید ، اما بسیاری از الگوهای دیگر را می توان جایگزین.

برای تأیید اعتبار ، هیچ تأیید اعتبار را انتخاب کنید. اگر تأیید اعتبار دیگری را انتخاب کنید ، از هویت اصلی ASP.NET استفاده خواهید کرد.

image

پس از ایجاد یک پروژه و اشکالزدایی آن ، صفحه نمایش در شکل زیر ظاهر می شود. ما یک برنامه بر اساس این صفحه ایجاد خواهیم کرد.

image

ویرایش Startup.cs

Startup.cs اضافه کردن تعاریف مورد نیاز برای احراز هویت کوکی. فضاهای نام استفاده:

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 و Addauthentication می توانید تأیید اعتبار کوکی را فعال کنید. تعیین کنید Cookieاحراز هویت پیش فرض ها. اعتبار نامه اگر لازم نیست که نام طرح را به طور خاص تغییر دهید.

گزینه های روش addauthorization. اگر شما تعیین کننده احراز هویت در خط مشی 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 است. محل در مقابل UseAuthorization (). همه چیز دیگر یک الگو باقی می ماند.

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

گام اول این است که برای ایجاد سمت کنترل. با اعطای مهارت ناشناس ، تمام اقدامات در آن می تواند حتی اگر آنها تصدیق نشده است انجام شود. این اجازه می دهد تا تنها صفحه ورود به سیستم بدون تأیید اعتبار قابل دسترسی باشد.

ویژگی های بی نام مجاز است مستقل از احراز هویت کوکی به عنوان یک مکان به غیر از صفحه ورود به سیستم. همچنین ممکن است در کنترل کننده های تنها 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 ایجاد یک کوکی و اعتبار آن است.

اگر ادعاهای اضافی مورد نیاز و یا کوکی ها منقضی, اضافه کردن پارامترها.

پس از ورود به سیستم ، ما به ~/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");
}

روند خروج را وارد کنید. شما می توانید یک کوکی را حذف و بازگشت آن را به یک حالت غیر قابل ورود با تماس HttpContext. SignOutAsync روش.

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

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

ایجاد یک نمایش (فرم ورود) (/Views/sr/sdshtml)

از آنجایی که ما آن را به حساب نمی آوریم ، یک فیلد برای وارد کردن نام کاربری و رمز عبور خود ، همانطور که در شکل زیر نشان داده شده است ، اضافه کنید و یک دکمه برای ورود به آن قرار دهید. شما همچنین باید یک لینک برای دسترسی به خانه/شاخص بدون ورود به سیستم برای اهداف تست قرار دهید.

از آنجا که برای وارد کردن نام کاربری و رمز عبور مشکل است ، مقدار اولیه تنظیم شده است.

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/s/d/_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>
<!-- 中略 -->

بررسی عملیات

شما در حال حاضر به اتمام حداقل اجرای مورد نیاز برای احراز هویت کوکی. سعی کنید آن را انجام دهید و ببینید که چگونه کار می کند. این باید رفتار بسته به اینکه شما وارد سیستم شوید یا نه تغییر دهید. به عنوان یک مثال ساده ، من فکر می کنم شما می توانید رفتار زیر را ببینید.

عملیات نتایج عملیات
رفتن به خانه بدون ورود به سیستم هدایت به صفحه ورود
ورود رفتن به صفحه اصلی
خروج از خانه و رفتن به خانه بدون ورود به سیستم هدایت به صفحه ورود
خروج از خانه و رفتن به خانه بدون ورود به سیستم رفتن به صفحه اصلی