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

Страница обновлена :
Дата создания страницы :

Среды

Визуальная студия
  • Визуальное сообщество студии 2019
ASP.NET ядро
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 до последнего на этот раз, процесс суждения, например, является ли пароль правильным, не является существенным.

Это Советы списки программы spartly. Загрузите полную программу для полного кода.

Создание проекта

Запустите Visual Studio и создайте новый проект.

image

выберите ASP.NET основное веб-приложение.

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 и AddCookie. Укажите CookieAuthenticationDefaults.AuthenticationScheme, если вам не нужно менять название схемы, в частности.

Параметры метода добавления. Если вы укажете 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();
  });
}

Добавьте аутентификацию в приложение. Добавить UseAuthentication(). Местоположение описания основано на документации 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?}");
  });
}

Создание учетной записиКонтроллер

Создайте контроллеры и действия, необходимые для создания экрана входа. Имя контроллера создается как AccountController. Это связано с тем, что по умолчанию имя контроллера и имя действия экрана входа определяются как «К/Счет/Войти». Если вы хотите изменить этот путь, вы можете изменить его с помощью опций метода 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();
}

Процесс аутентификации после нажатия кнопки входа. Если имя пользователя и пароль совпадают, его можно проверить подлинность.

Следующий код определяет claim, identity и Pricinpal как минимальный код, необходимый для проверки подлинности. Вызов метода HttpContext.signInAsync генерирует файл cookie и проверяет его подлинность.

Если требуются дополнительные требования или срок действия файлов cookie истекает, добавляйте параметры.

После входа в систему мы перенаправились на q/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.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>

Создание ссылки на выйти из системы (/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. Попробуйте сделать это и посмотреть, как это работает. Это должно изменить поведение в зависимости от того, входите вы в систему или нет. В качестве простого примера, я думаю, вы можете увидеть следующее поведение.

Операция - Результаты операции
Идите домой без входа в систему Перенаправить на экран входа
Входа Перейти на домашний экран
Вход из дома и идти домой без входа в Перенаправить на экран входа
Не выходите из дома и идите домой без входа в систему Перейти на домашний экран