Erstellen eines Mechanismus, der umgeleitet wird, wenn Sie sich nicht mit der Cookie-Authentifizierung anmelden (ASP.NET Core 3.0)

Diese Seite wurde aktualisiert :
Erstellungsdatum der Seite :

Umgebung

Visual Studio
  • Visual Studio Community 2019
ASP.NET Core
3.0 oder höher

Die Cookie-Authentifizierung kann in .NET Core 2.2 oder früher verwendet werden, aber unsere Tipps enthalten Code speziell für .NET Core 3.0 und höher.

Zunächst

ASP.NET Core verwendet die Cookie-Authentifizierung als Anmeldeauthentifizierungsmechanismus. Sie können sich die Cookie-Authentifizierung als etwas Ähnliches wie die herkömmliche Formularauthentifizierung vorstellen.

Eine weitere Möglichkeit, ASP.NET Core zu authentifizieren, ist ASP.NET Core Identity. Neben der Authentifizierung mit Formularen, api-Authentifizierung, externen Anmeldediensten, Passwortverwaltung und Zurücksetzen usw. Sie können viele Funktionen verwenden. Aus der Sicht, dieses Mal nur einen einfachen Login-Bildschirm zu machen, wird es jedoch zu einem Mechanismus der etwas übertriebenen Authentifizierung. Ich benutze es zum jetzigen Zeitpunkt nicht.

In den Tipps für die Cookie-Authentifizierung können Sie nichts anderes als den Anmeldebildschirm anzeigen, es sei denn, Sie melden sich an. Wenn Sie versuchen, zu einem anderen Bildschirm zu wechseln, werden Sie zum Anmeldebildschirm weitergeleitet. Sie können auch andere Bildschirme sehen, indem Sie sich anmelden.

Sobald Sie Ihren Benutzernamen und Ihr Kennwort auf dem Anmeldebildschirm eingegeben haben, können Sie sich anmelden. Die Authentifizierung des Benutzers selbst wird in einer temporären Position implementiert. Da die Hauptimplementierung der Cookie-Authentifizierung diesmal die letzte ist, ist der Urteilsprozess, z. B. ob das Kennwort korrekt ist, nicht unbedingt erforderlich.

Diese Tipps listet das Programm teilweise auf. Laden Sie das komplette Programm für den vollständigen Code herunter.

Erstellen eines Projekts

Starten Sie Visual Studio, und erstellen Sie ein neues Projekt.

image

wählen Sie ASP.NET Core Web Application aus.

image

Geben Sie einen beliebigen Projektnamen und Projektspeicherort an.

image

Dieses Mal verwenden wir mvc-Projekte, aber die meisten anderen Vorlagen können ersetzt werden.

Wählen Sie für die Authentifizierung keine Authentifizierung aus. Wenn Sie eine andere Authentifizierung auswählen, verwenden Sie ASP.NET Core Identity.

image

Nachdem Sie ein Projekt erstellt und gedebugpft haben, wird der Bildschirm in der Abbildung unten angezeigt. Wir erstellen ein Programm basierend auf diesem Bildschirm.

image

Bearbeiten Startup.cs

Startup.cs die für die Cookie-Authentifizierung erforderlichen Definitionen hinzufügen. Namespaces verwenden:

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;

Sie können die Cookie-Authentifizierung aktivieren, indem Sie die AddAuthentication- und AddCookie-Methoden ausführen. Geben Sie CookieAuthenticationDefaults.AuthenticationScheme an, wenn Sie den Schemanamen nicht speziell ändern müssen.

Die Optionen für die Addautorisierungsmethode. Wenn Sie RequireAuthenticatedUser in FallbackPolicy angeben, Auf alle Controller kann eine authentifizierungserforderliche Richtlinie angewendet werden. Es ist auch in dem Sinne nützlich, dass der Code reduziert wird und der Beschreibungsfehler verhindert wird, wenn eine andere Authentifizierung als der Anmeldebildschirm erforderlich ist. Nur der Anmeldebildschirm schreibt den Code, der keine Authentifizierung erfordert, einzeln.

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

Fügen Sie Ihrer Anwendung eine Authentifizierung hinzu. Add UseAuthentication(). Der Beschreibungsort basiert auf der MSDN-Dokumentation. Platzieren Sie sich vor UseAuthorization(). Alles andere bleibt eine Vorlage.

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

Erstellen eines AccountControllers

Erstellen Sie die Controller und Aktionen, die Sie zum Erstellen eines Anmeldebildschirms benötigen. Der Controllername wird als AccountController erstellt. Dies liegt daran, dass standardmäßig der Controllername und der Aktionsname des Anmeldebildschirms als "-/Konto/Login" festgelegt werden. Wenn Sie diesen Pfad ändern möchten, können Sie ihn mit den Optionen der AddCookie-Methode in Startup.cs ändern. Wir werden mit den Standardeinstellungen durchgehen.

image

Der erste Schritt besteht darin, die Controllerseite zu erstellen. Durch Das Gewähren des AllowAnonymous-Attributs können alle darin ausgeführten Aktionen auch dann ausgeführt werden, wenn sie nicht authentifiziert sind. Dadurch kann nur auf den Anmeldebildschirm ohne Authentifizierung zugegriffen werden.

Das AllowAnonymous-Attribut ist unabhängig von der Cookie-Authentifizierung als anderer Speicherort als der Anmeldebildschirm. Es kann auch auf api-only-Controllern verwendet werden.

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

Definieren Sie die Benutzer und Kennwörter, die angemeldet werden können. Ursprünglich speichere ich es in einer Datenbank, aber dieses Mal ist das Urteil des Benutzers nicht der Hauptfokus Ich mache es durch ein temporäres Set.

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

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

Dies ist eine Aktion zum Anzeigen des Anmeldebildschirms. Geben Sie die Ansicht so zurück, wie sie ist, da sie nur angezeigt wird.

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

Authentifizierungsvorgang nach Dem Drücken der Anmeldetaste. Wenn der Benutzername und das Kennwort übereinstimmen, kann er authentifiziert werden.

Der folgende Code definiert Anspruch, Identität und Pricinpal als den Mindestcode, der für die Authentifizierung erforderlich ist. Durch Aufrufen der HttpContext.SignInAsync-Methode wird ein Cookie generiert und authentifiziert.

Wenn zusätzliche Ansprüche erforderlich sind oder Cookies ablaufen, fügen Sie Parameter hinzu.

Nach der Anmeldung haben wir uns auf die Authentifizierung umgeleitet.

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

Geben Sie den Abmeldevorgang ein. Sie können ein Cookie löschen und in einen nicht protokollierten Zustand zurücksetzen, indem Sie die HttpContext.SignOutAsync-Methode aufrufen.

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

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

Erstellen einer Ansicht (Anmeldeformular) (/Views/Account/Login.cshtml)

Da wir dies nicht berücksichtigen, fügen Sie ein Feld hinzu, um Ihren Benutzernamen und Ihr Kennwort einzugeben, wie in der Abbildung unten gezeigt, und platzieren Sie eine Schaltfläche, um sich anzumelden. Sie sollten auch einen Link platzieren, um auf Home/Index zuzugreifen, ohne sich zu Testzwecken anzumelden.

Da es schwierig ist, den Benutzernamen und das Kennwort einzugeben, wird der Anfangswert festgelegt.

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>

Erstellen eines Abmeldelinks (/Views/Shared/_Layout.cshtml)

Der Startbildschirm ändert nichts, aber Sie haben einen Abmeldelink in der Navigationsleiste. Darüber hinaus werde ich auch einen Link setzen, der zum Anmeldebildschirm übergeht, ohne sich zu Testzwecken abzumelden.

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

Prüfvorgang

Sie haben nun die für die Cookie-Authentifizierung erforderliche Mindestimplementierung abgeschlossen. Versuchen Sie es zu tun und sehen, wie es funktioniert. Es sollte das Verhalten ändern, je nachdem, ob Sie angemeldet sind oder nicht. Als einfaches Beispiel denke ich, dass Sie das folgende Verhalten sehen können.

Operation - Operation Ergebnisse
Gehen Sie nach Hause, ohne sich einzuloggen Umleiten zum Anmeldebildschirm
einloggen Gehen Sie zum Startbildschirm
Melden Sie sich von zu Hause aus und gehen Sie nach Hause, ohne sich anzumelden Umleiten zum Anmeldebildschirm
Melden Sie sich nicht von zu Hause ab und gehen Sie nach Hause, ohne sich anzumelden Gehen Sie zum Startbildschirm