Създайте механизъм, който да бъде пренасочен, ако не влезете с помощта на удостоверяване с бисквитки (ASP.NET Core 3.0)

Страницата се актуализира :
Дата на създаване на страница :

Околната среда

Визуален студио
  • Визуална общност 2019
ASP.NET ядро
3.0 или по-нова версия

Удостоверяването на бисквитки може да се използва в .NET Core 2.2 или по-рано, но нашите съвети включват код специално за .NET Core 3.0 и по-нови версии.

На първо място

ASP.NET Core използва удостоверяване на бисквитка като механизъм за удостоверяване за влизане. Можете да мислите за удостоверяване на бисквитка като нещо подобно на традиционните формуляри удостоверяване.

Друг начин да се удостовери ASP.NET Ядро е ASP.NET Същност. В допълнение към удостоверяване то използване на формуляри, API удостоверяване, външни услуги за влизане, управление на пароли и нулиране и др. Можете да използвате много функции. Въпреки това, от гледна точка на просто вземане на прост екран за вход този път, тя се превръща в механизъм на малко преувеличени удостоверяване Не го използвам в момента.

В съветите за удостоверяване на "бисквитки" не можете да покажете нищо друго освен екрана за вход, освен ако не влезете. Ако се опитате да отидете на друг екран, ще бъдете пренасочени към екрана за вход. Можете да видите и други екрани, като влезете в системата.

След като въведете вашето потребителско име и парола на екрана за вход, можете да влезете. Удостоверяване на самия потребител се изпълнява във временна позиция. Тъй като основното внедряване на удостоверяването на "бисквитките" е до последно време този път, процесът на преценка, като например дали паролата е правилна, не е от съществено значение.

Този съвет изброява програмата отчасти. Изтеглете пълната програма за пълния код.

Създаване на проект

Стартирайте Visual Studio и създайте нов проект.

image

изберете ASP.NET основно уеб приложение.

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 и AddCookie методи. Задайте CookieAuthenticationDefaults.AuthenticationScheme Ако не е необходимо да променяте името на схемата по-специално.

Опциите за метод аaddauthorization. Ако укажете Изискванеудостоиранипотребител в резервнаполитика, Всички контролери могат да имат изисква удостоверяване правила, приложени към действието. Също така е полезно в смисъл, че кодът се намалява и грешка описание се предотвратява, ако удостоверяване се изисква, различен от екрана за вход. Само в екрана за влизане ще се запише код, който не изисква удостоверяване индивидуално.

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

Създаване на акаунтконтролер

Създайте контролерите и действията, които са ви необходими, за да създадете екран за вход. Името на контролера е създаден като AccountController. Това е така, защото по подразбиране името на контролера и името на действие на екрана за влизане се определят като "~/Account/Login". Ако искате да промените този път, можете да го промените с опциите на AddCookie метод в Startup.cs. Ще преминем през настройките по подразбиране.

image

Първата стъпка е да се създаде страната на контролера. С предоставянето на атрибута AllowAnonymous, всички действия в него могат да бъдат извършени, дори ако не са удостоверени. Това позволява само на екрана за вход да бъде достъпен без удостоверяване.

Атрибутът AllowAnonymous е независим от удостоверяването на "бисквитките" като местоположение, различно от екрана за влизане. Тя може да се използва и при контролери само за апи.

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

Създаване на изглед (формуляр за вход) (/изгледи/акаунт/Вход.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>
<!-- 中略 -->

Проверка на операцията

Сега сте завършили минималното изпълнение, необходимо за удостоверяване на бисквитка. Опитайте се да го направите и да видим как работи. Това трябва да промени поведението в зависимост от това дали сте влезли или не. Като прост пример, мисля, че можете да видите следното поведение.

Резултати
Работа от операцията
Прибери се вкъщи без да влизаш Пренасочване към екрана за вход
Вход Отиди на началния екран
Излезте от дома си и се приберете вкъщи, без да влизате Пренасочване към екрана за вход
Не излизайте от дома си и не се прибирайте вкъщи, без да влизате Отиди на началния екран