Creeu un mecanisme per ser redirigit si no inicieu sessió mitjançant l'autenticació de galetes (ASP.NET Core 3.0)

Pàgina actualitzada :
Data de creació de la pàgina :

Medi ambient

Visual Studio
  • Visual Studio Community 2019
ASP.NET Core
3,0 o posterior

L'autenticació de cookies es pot utilitzar en .NET Core 2,2 o anterior, però els nostres consells inclouen codi específic per .NET Core 3,0 i posterior.

Al principi

ASP.NET Core utilitza l'autenticació de galetes com un mecanisme d' autenticació de login. Podeu pensar en l'autenticació de galetes com una cosa semblant a l'autenticació de formularis tradicionals.

Una altra manera d'autenticar ASP.NET Core és ASP.NET'identitat bàsica. A més de l'autenticació mitjançant formularis, l'autenticació de l'API, serveis de login externs, gestió de contrasenyes i restablir, etc. Podeu utilitzar moltes funcions. No obstant això, des del punt de vista de simplement fer una simple pantalla d'inici de sessió aquesta vegada, es converteix en un mecanisme d'autenticació una mica exagerat No l'utilitzo en aquest moment.

En els consells per a l'autenticació de galetes, no es pot mostrar res més que la pantalla d'inici de sessió a menys que entreu. Si intenteu anar a una altra pantalla, se us reenviarà a la pantalla d'inici de sessió. També podeu veure altres pantalles iniciant la sessió.

Una vegada que introdueixi el seu nom de l'usuari i contrasenya a la pantalla de connexió, pot connectar. L'autenticació de l'usuari mateix està implementada en una posició temporal. Atès que la principal aplicació d'autenticació de galetes és la darrera d'aquest temps, el procés de la sentència, com ara si la contrasenya és correcta, no és essencial.

Aquest consells enumera el programa spartly. Descarregueu-vos el programa complet per al codi complet.

Crear un projecte

Inicieu el Visual Studio i creeu un nou projecte.

image

seleccioni ASP.net aplicació de webs bàsica.

image

Especifiqueu qualsevol nom de projecte i ubicació del projecte.

image

Aquesta vegada, utilitzarem projectes MVC, però la majoria de les altres plantilles poden ser substituïdes.

Per a l'autenticació, seleccioneu sense autenticació. Si escolliu una altra autenticació, utilitzareu la identitat ASP.NET Core.

image

Després de crear un projecte i depurar-lo, apareix la pantalla de la figura següent. Crearem un programa basat en aquesta pantalla.

image

Edit Startup.cs

Startup.cs afegir les definicions requerides per a l'autenticació de galetes. Ús de namespaces:

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;

Podeu activar l'autenticació de galetes executant els mètodes AddAuthentication i AddCookie. Especifiqueu CookieAuthenticationDefaults. AuthenticationScheme si no necessiteu canviar el nom de l'esquema en particular.

Les opcions del mètode addautoritzaci ≤. Si especifiqueu RequireAuthenticatedUser a FallbackPolicy, Tots els controladors poden tenir una política d'autenticació necessària aplicada a l'acció. També és útil en el sentit que el codi es redueix i l'error de Descripció s'impedeix si es requereix autenticació diferent de la pantalla d'inici de sessió. Només la pantalla d'inici de sessió escriurà el codi que no requereix autenticació individualment.

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

Afegiu l'autenticació a la vostra aplicació. Afegeix UseAuthentication (). La ubicació de descripció es basa en la documentació de MSDN. Lloc davant de l'autorització d'Useautoritzacions (). Tota la resta segueix sent una plantilla.

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

Creació d'un account Controller

Creeu els controladors i les accions que necessiteu per crear una pantalla d'inici de sessió. El nom del controlador es crea com a comptador de control. Això es deu al fet que per defecte, el nom del controlador i el nom de l'acció de la pantalla d'inici de sessió estan decidits a ser "~/Account/Login". Si voleu canviar aquest camí, podeu canviar-lo amb les opcions del mètode AddCookie a Startup.cs. Anirem amb la configuració per defecte.

image

El primer pas és crear el costat del controlador. En concedir l'atribut AllowAnonymous , totes les accions es poden realitzar encara que no estiguin autenticades. Això permet que només s'accedeixi a la pantalla d'inici de sessió sense autenticació.

L'atribut AllowAnonymous és independent de l'autenticació de galetes com una ubicació diferent de la pantalla d'inici de sessió. També es pot utilitzar en els controladors de només 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
  {
  }
}

Definiu els usuaris i les contrasenyes que es poden connectar. Originalment el guardo a una base de dades, però aquesta vegada el judici d'usuari no és el focus principal Ho faig per un conjunt temporal.

/// <summary>仮のユーザーデータベースとする。</summary>
private Dictionary<string, string> UserAccounts { get; set; }

public AccountController()
{
  // 仮のユーザーを登録する
  UserAccounts = new Dictionary<string, string>
  {
    { "user1", "password1" },
    { "user2", "password2" },
  };
}

Aquesta és una acció per mostrar la pantalla d'inici de sessió. Retorna la vista tal com és perquè només es mostra.

/// <summary>ログイン画面を表示します。</summary>
public IActionResult Login()
{
  return View();
}

Procés d'autenticació després de prémer el botó d'inici de sessió. Si el nom d'usuari i la contrasenya coincideixen, es pot autenticar.

El codi següent defineix reclamació, identitat i Pricinpal com el codi mínim requerit per a l'autenticació. Cridar el mètode HttpContext. SignInAsync genera una galeta i l'autentica.

Si es requereixen reclamacions addicionals o les galetes caduquen, afegiu paràmetres.

Després d'iniciar sessió, hem redirigit a ~/Home/Index, que requereix autenticació.

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

Introduïu el procés de tancament de sessió. Podeu suprimir una galeta i tornar-la a un estat no registrat cridant el mètode HttpContext. SignOutAsync.

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

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

Crear una visualització (formulari d'inici de sessió) (/Views/Account/Login.cshtml)

Com que no ho tenim en compte, afegiu un camp per introduir el nom d'usuari i la contrasenya, tal com es mostra a la figura següent, i col·loqueu un botó per iniciar la sessió. També hauria de posar un enllaç per accedir a casa/índex sense connectar-s'hi per a propòsits de testatge.

Com que és molest per introduir el nom d'usuari i la contrasenya, el valor inicial s'estableix.

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>

Creeu un enllaç de tancament de sessió (/Views/Shared/_Layout. cshtml)

La pantalla d'inici no canviarà res, però tindreu un enllaç de tancament de sessió a la barra de navegació. A més a més, també posaré un enllaç que les transicions a la pantalla de connexió sense tancar-se fora per a propòsits de testatge.

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>
<!-- 中略 -->

Comprova l'operació

Ara heu completat la implementació mínima necessària per a l'autenticació de galetes. Intenta fer-ho i veure com funciona. Ha de canviar el comportament en funció de si vostè està connectat o no. Com a exemple simple, penso que pugui veure el comportament següent.

Operació resultats operació
Anar a casa sense entrar Redirigir a la pantalla d'inici de sessió
Connexió Vés a la pantalla d'inici
Tancar sessió de casa i anar a casa sense entrar Redirigir a la pantalla d'inici de sessió
No desconnecti de casa i vagi a casa sense connectar-se Vés a la pantalla d'inici