Crear un mecanismo para ser redirigido si no inicia sesión con autenticación de cookies (ASP.NET Core 3.0)

Actualización de la página :
Fecha de creación de la página :

Ambiente

Visual Studio
  • Comunidad de Visual Studio 2019
Núcleo ASP.NET
3.0 o posterior

La autenticación de cookies se puede usar en .NET Core 2.2 o versiones anteriores, pero nuestras sugerencias incluyen código específico para .NET Core 3.0 y versiones posteriores.

Al principio

ASP.NET Core utiliza la autenticación de cookies como mecanismo de autenticación de inicio de sesión. Puede pensar en la autenticación de cookies como algo similar a la autenticación de formularios tradicionales.

Otra forma de autenticar ASP.NET Core es ASP.NET identidad principal. Además de la autenticación mediante formularios, autenticación api, servicios de inicio de sesión externos, administración y restablecimiento de contraseñas, etc. Puede utilizar muchas funciones. Sin embargo, desde el punto de vista de simplemente hacer una simple pantalla de inicio de sesión esta vez, se convierte en un mecanismo de una autenticación un poco exagerada No lo uso en este momento.

En los consejos para la autenticación de cookies, no puede mostrar nada que no sea la pantalla de inicio de sesión a menos que inicie sesión. Si intenta ir a una pantalla diferente, se le redirigirá a la pantalla de inicio de sesión. También puede ver otras pantallas iniciando sesión.

Una vez que introduzca su nombre de usuario y contraseña en la pantalla de inicio de sesión, puede iniciar sesión. La autenticación del propio usuario se implementa en una posición temporal. Dado que la implementación principal de la autenticación de cookies es hasta el último esta vez, el proceso de juicio, como si la contraseña es correcta, no es esencial.

En este informe se enumera el programa de forma escasa. Descargue el programa completo para el código completo.

Crear un proyecto

Inicie Visual Studio y cree un nuevo proyecto.

image

seleccione ASP.NET aplicación web principal.

image

Especifique cualquier nombre de proyecto y ubicación del proyecto.

image

Esta vez, usaremos proyectos mvc, pero la mayoría de las otras plantillas se pueden sustituir.

Para la autenticación, seleccione Sin autenticación. Si elige otra autenticación, utilizará ASP.NET identidad principal.

image

Después de crear un proyecto y depurarlo, aparece la pantalla de la figura siguiente. Vamos a crear un programa basado en esta pantalla.

image

Editar Startup.cs

Startup.cs agregar las definiciones necesarias para la autenticación de cookies. Los espacios de nombres utilizan:

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;

Puede habilitar la autenticación de cookies ejecutando los métodos AddAuthentication y AddCookie. Especifique CookieAuthenticationDefaults.AuthenticationScheme si no necesita cambiar el nombre del esquema en particular.

Las opciones del método addauthorization. Si especifica RequireAuthenticatedUser en FallbackPolicy, Todos los reguladores pueden tener una directiva requerida de autenticación aplicada a la acción. También es útil en el sentido de que el código se reduce y el error de descripción se impide si se requiere autenticación que no sea la pantalla de inicio de sesión. Solo la pantalla de inicio de sesión escribirá el código que no requiere autenticación individualmente.

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

Agregue autenticación a la aplicación. Agregar UseAuthentication(). La ubicación de la descripción se basa en la documentación de MSDN. Colocar delante de UseAuthorization(). Todo lo demás sigue siendo 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ón de un AccountController

Cree los controladores y las acciones que necesita para crear una pantalla de inicio de sesión. El nombre del controlador se crea como AccountController. Esto se debe a que, de forma predeterminada, el nombre del controlador y el nombre de la acción de la pantalla de inicio de sesión se determinan como "/Cuenta/Inicio de sesión". Si desea cambiar esta ruta de acceso, puede cambiarla con las opciones del método AddCookie en Startup.cs. Vamos a seguir con la configuración predeterminada.

image

El primer paso es crear el lado del controlador. Al conceder el atributo AllowAnonymous, todas las acciones en él se pueden realizar incluso si no están autenticadas. Esto permite que solo se acceda a la pantalla de inicio de sesión sin autenticación.

El atributo AllowAnonymous es independiente de la autenticación de cookies como una ubicación distinta de la pantalla de inicio de sesión. También se puede utilizar en controladores api-only.

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
  {
  }
}

Defina los usuarios y contraseñas que se pueden iniciar sesión. Originalmente lo guardo en una base de datos, pero esta vez el juicio del usuario no es el foco principal Lo hago con un set temporal.

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

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

Esta es una acción para mostrar la pantalla de inicio de sesión. Devuelve la vista tal como está porque solo se muestra.

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

Proceso de autenticación después de pulsar el botón de inicio de sesión. Si el nombre de usuario y la contraseña coinciden, se pueden autenticar.

El código siguiente define la notificación, la identidad y Pricinpal como el código mínimo necesario para la autenticación. Llamar al método HttpContext.SignInAsync genera una cookie y la autentica.

Si se requieren reclamaciones adicionales o las cookies caducan, agregue parámetros.

Después de iniciar sesión, hemos redirigido a /Home/Index, que requiere autenticación.

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

Introduzca el proceso de cierre de sesión. Puede eliminar una cookie y devolverla a un estado sin registrar llamando al método HttpContext.SignOutAsync.

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

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

Crear una vista (formulario de inicio de sesión) (/Views/Account/Login.cshtml)

Puesto que no lo tenemos en cuenta, agregue un campo para ingresar su nombre de usuario y contraseña, como se muestra en la figura siguiente, y coloque un botón para iniciar sesión. También debe colocar un vínculo para acceder a Inicio/índice sin iniciar sesión con fines de prueba.

Dado que es problemático escribir el nombre de usuario y la contraseña, se establece el valor inicial.

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>

Crear un vínculo de cierre de sesión (/Views/Shared/_Layout.cshtml)

La pantalla de inicio no cambiará nada, pero tendrás un enlace de cierre de sesión en la barra de navegación. Además, también pondré un enlace que pasa a la pantalla de inicio de sesión sin cerrar sesión con fines de prueba.

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

Comprobar operación

Ahora ha completado la implementación mínima necesaria para la autenticación de cookies. Trate de hacerlo y ver cómo funciona. Debe cambiar el comportamiento dependiendo de si ha iniciado sesión o no. Como ejemplo simple, creo que puedes ver el siguiente comportamiento.

- Resultados
Operaciónde la operación
Vete a casa sin iniciar sesión Redirección a la pantalla de inicio de sesión
Iniciar sesión Ir a la pantalla de inicio
Cierre la sesión de casa y váyase a casa sin iniciar sesión Redirección a la pantalla de inicio de sesión
No cierres la sesión de casa y vete a casa sin iniciar sesión Ir a la pantalla de inicio