Створіть механізм перенаправлення, якщо ви не ввійдете в систему за допомогою аутентифікації файлів cookie (ASP.NET Core 3.0)

Сторінка оновлюється :
Дата створення сторінки :

Середовищі

Visual Studio
  • Visual Studio спільноти 2019
ASP.NET Core
3,0 або пізнішої версії

Автентифікація файлів cookie може використовуватися в .NET Core 2,2 або ранішої версії, але наші поради включають код спеціально для .NET Core 3,0 і пізніших версій.

На перший

ASP.NET Core використовує аутентифікацію файлів cookie в якості механізму аутентифікації логіна. Ви можете думати про cookie аутентифікації як щось подібне до традиційної аутентифікації форм.

Інший спосіб аутентифікації ASP.NET Core є ASP.NET Core Identity. На додаток до аутентифікації за допомогою форм, API аутентифікації, зовнішні послуги Логін, управління паролями і скидання і т. д. Ви можете використовувати багато функцій. Однак, з точки зору просто зробити простий логін екрані на цей раз, він стає механізмом трохи перебільшена аутентифікації Я не використовую його в цей час.

У підказках для перевірки файлів cookie ви не можете відображати нічого, крім входу на екран, якщо ви не входите в систему. При спробі перейти на інший екран, ви будете перенаправлені на екран входу в систему. Ви також можете побачити інші екрани, увійшовши в систему.

Після введення імені користувача та пароля на екрані входу до системи можна ввійти в обліковий запис. Аутентифікація самого користувача реалізується в тимчасове положення. Оскільки основна реалізація аутентифікації файлів cookie є останнім цього разу, процес суду, наприклад, чи правильний пароль, не є суттєвим.

Ця Рада перелічує програму Спарта. Завантажте повну програму для повного коду.

Створити проект

Запустіть Visual Studio та створіть новий проект.

image

виберіть ASP.net Core веб-додатків.

image

Укажіть ім'я та розташування проекту.

image

На цей раз ми будемо використовувати MVC проекти, але більшість інших шаблонів можна замінити.

Для автентифікації виберіть без автентифікації. Якщо ви виберете інший автентифікації, ви будете використовувати ASP.NET Core Identity.

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. Вкажіть CookieAuthenticationDefaults. AuthenticationScheme, якщо вам не потрібно змінювати назву схеми, зокрема.

Варіанти методу addauthorization. Якщо ви вкажете RequireAuthenticatedUser в політиці падіння, Усі контролери можуть мати політику, необхідну для автентифікації, застосоване до дії. Це також корисно в тому сенсі, що код зменшується, і помилка опису не може, якщо автентифікація необхідна, крім входу на екран. Тільки екран входу буде писати код, який не вимагає аутентифікації індивідуально.

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

Створення Рахунцконтролера

Створіть контролери і дії, необхідні для створення екрану входу в систему. Ім'я контролера створюється як Рахунцконтролера. Це пояснюється тим, що за замовчуванням ім'я контролера та назва дії на екрані входу визначаються як "~/аккаунт//". Якщо ви хочете змінити цей шлях, ви можете змінити його з параметрами методу AddCookie в Startup.cs. Ми підемо з настройками за замовчуванням.

image

Першим кроком є створення боку контролера. Надаючи Дозволятианонімний атрибут, всі дії в ньому можуть виконуватися, навіть якщо вони не автентифіковано. Це дозволяє тільки екран входу до системи, щоб отримати доступ без аутентифікації.

Дозволятианонімний атрибут не залежить від автентифікації файлів 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();
}

Процес аутентифікації після натискання кнопки Логін. Якщо ім'я користувача та пароль збігаються, його можна автентифікувати.

Наведений нижче код визначає претензії, ідентичність та Прісіпаль як мінімальний код, необхідний для автентифікації. Виклик HttpContext. Синхронеасинхронний метод генерує файл cookie та засвідчує його.

Якщо потрібні додаткові вимоги або термін дії файлів cookie закінчиться, додайте параметри.

Після входу в систему, ми перенаправлені на ~/HOMR/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));
}

Створити подання (форма для входу) (/Views/Account/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>

Створення посилання вихід із системи (/SC/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. Спробуйте зробити це і подивитися, як це працює. Це має змінити поведінку залежно від того, чи ви ввійшли в систему чи ні. Як простий приклад, я думаю, ви можете побачити наступну поведінку.

Операція результати роботи
Іди додому без входу в систему Переспрямування на екран входу
Логін Перейти на головний екран
Вийдіть з дому і повернутися додому без входу в систему Переспрямування на екран входу
Не виходити з дому і повернутися додому без входу в систему Перейти на головний екран