Créer un mécanisme à rediriger si vous ne vous connectez pas à l’aide de l’authentification par cookie (ASP.NET Core 3.0)

Page mise à jour :
Date de création de la page :

Environnement

Studio visuel
  • Communauté de studio visuel 2019
ASP.NET cœur
3.0 ou plus tard

L’authentification des cookies peut être utilisée dans .NET Core 2.2 ou plus tôt, mais nos conseils incluent le code spécifiquement pour .NET Core 3.0 et plus tard.

Dans un premier temps

ASP.NET Core utilise l’authentification des cookies comme mécanisme d’authentification de connexion. Vous pouvez penser à l’authentification des cookies comme quelque chose de similaire à l’authentification des formes traditionnelles.

Une autre façon d’authentifier ASP.NET Core est ASP.NET’identité de base. En plus de l’authentification à l’aide de formulaires, d’authentification api, de services de connexion externes, de gestion et de réinitialisation des mots de passe, etc. Vous pouvez utiliser beaucoup de fonctions. Cependant, du point de vue de simplement faire un simple écran de connexion cette fois, il devient un mécanisme d’authentification un peu exagérée Je ne l’utilise pas pour le moment.

Dans les conseils pour l’authentification des cookies, vous ne pouvez pas afficher autre chose que l’écran de connexion à moins que vous vous connectiez. Si vous essayez d’aller à un autre écran, vous serez redirigé vers l’écran de connexion. Vous pouvez également voir d’autres écrans en vous connectant.

Une fois que vous entrez votre nom d’utilisateur et mot de passe sur l’écran de connexion, vous pouvez vous connecter. L’authentification de l’utilisateur lui-même est mise en œuvre dans une position temporaire. Étant donné que la mise en œuvre principale de l’authentification des cookies est à la dernière cette fois, le processus de jugement, par exemple si le mot de passe est correct, n’est pas essentiel.

Ce conseils répertorie le programme spartly. Téléchargez le programme complet pour le code complet.

Créer un projet

Démarrez Visual Studio et créez un nouveau projet.

image

sélectionner ASP.NET’application Web de base.

image

Spécifier le nom du projet et l’emplacement du projet.

image

Cette fois, nous allons utiliser des projets mvc, mais la plupart des autres modèles peuvent être substitués.

Pour l’authentification, sélectionnez Pas d’authentification. Si vous choisissez d’autres authentifications, vous utiliserez ASP.NET’identité de base.

image

Après avoir créé un projet et l’avoir débogé, l’écran de la figure ci-dessous apparaît. Nous allons créer un programme basé sur cet écran.

image

Modifier Startup.cs

Startup.cs ajouter les définitions requises pour l’authentification des cookies. Les espaces de noms utilisent :

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;

Vous pouvez activer l’authentification des cookies en exécutant les méthodes AddAuthentication et AddCookie. Spécifier CookieAuthenticationDefaults.AuthenticationScheme si vous n’avez pas besoin de changer le nom du régime en particulier.

Les options de méthode d’atorisation addauthorization. Si vous spécifiez RequireAuthenticatedUser in FallbackPolicy, Tous les contrôleurs peuvent avoir une stratégie d’authentification requise appliquée à l’action. Il est également utile en ce sens que le code est réduit et l’erreur de description est évitée si l’authentification est nécessaire autre que l’écran de connexion. Seul l’écran de connexion écrira le code qui ne nécessite pas d’authentification individuellement.

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

Ajoutez l’authentification à votre application. Ajouter UseAuthentication(). L’emplacement de la description est basé sur la documentation MSDN. Placez-vous devant UseAuthorization(). Tout le reste reste un modèle.

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

Création d’un accountController

Créez les contrôleurs et les actions dont vous avez besoin pour créer un écran de connexion. Le nom du contrôleur est créé sous le nom de AccountController. C’est parce que par défaut, le nom du contrôleur et le nom d’action de l’écran de connexion sont déterminés comme étant "/Compte/Login". Si vous voulez changer ce chemin, vous pouvez le changer avec les options de la méthode AddCookie en Startup.cs. Nous allons aller jusqu’au bout avec les paramètres par défaut.

image

La première étape consiste à créer le côté contrôleur. En accordant l’attribut AllowAnonymous, toutes les actions qui y sont peuvent être exécutées même si elles ne sont pas authentifiées. Cela permet d’accéder uniquement à l’écran de connexion sans authentification.

L’attribut AllowAnonymous est indépendant de l’authentification des cookies en tant qu’emplacement autre que l’écran de connexion. Il peut également être utilisé sur les contrôleurs api-seulement.

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

Définissez les utilisateurs et les mots de passe qui peuvent être connectés. À l’origine, je l’enregistre dans une base de données, mais cette fois le jugement de l’utilisateur n’est pas l’objectif principal Je le fais par un ensemble temporaire.

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

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

Il s’agit d’une action pour afficher l’écran de connexion. Retournez la vue telle qu’elle est parce qu’elle ne s’affiche.

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

Processus d’authentification après avoir appuyé sur le bouton de connexion. Si le nom d’utilisateur et le mot de passe correspondent, il peut être authentifié.

Le code suivant définit la réclamation, l’identité et Pricinpal comme le code minimum requis pour l’authentification. Appeler la méthode HttpContext.SignInAsync génère un cookie et l’authentifie.

Si des réclamations supplémentaires sont nécessaires ou si les cookies expirent, ajoutez des paramètres.

Après nous être connectés, nous avons redirigé vers l’indice/accueil/ ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '

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

Entrez le processus de logout. Vous pouvez supprimer un cookie et le retourner à un état non enregistré en appelant la méthode HttpContext.SignOutAsync.

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

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

Créer une vue (formulaire de connexion) (/Vues/Compte/Login.cshtml)

Puisque nous ne le prenons pas en compte, ajoutez un champ pour entrer votre nom d’utilisateur et mot de passe, comme indiqué dans la figure ci-dessous, et placez un bouton pour vous connecter. Vous devez également placer un lien pour accéder à Home/Index sans vous connecter à des fins de test.

Parce qu’il est gênant d’entrer le nom d’utilisateur et mot de passe, la valeur initiale est définie.

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>

Créer un lien logout (/Vues/Partagé/_Layout.cshtml)

L’écran d’accueil ne changera rien, mais vous aurez un lien logout dans la barre de navigation. En outre, je vais également mettre un lien qui passe à l’écran de connexion sans se connecter à des fins de test.

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

Vérifier l’opération

Vous avez maintenant terminé la mise en œuvre minimale requise pour l’authentification des cookies. Essayez de le faire et de voir comment cela fonctionne. Il devrait changer le comportement selon que vous êtes connecté ou non. Comme un exemple simple, je pense que vous pouvez voir le comportement suivant.

Résultats
de l’opération et de l’opération 操作
Rentrez chez vous sans vous connecter Rediriger vers l’écran de connexion
connectez-vous Aller à l’écran d’accueil
Déconnectez-vous de la maison et rentrez chez vous sans vous connecter Rediriger vers l’écran de connexion
Ne vous déconnectez pas de la maison et rentrez chez vous sans vous connecter Aller à l’écran d’accueil