Creare un meccanismo da reindirizzare se non si effettua l'accesso utilizzando l'autenticazione dei cookie (ASP.NET Core 3.0)

Pagina aggiornata :
Data di creazione della pagina :

Ambiente

Visual Studio
  • Community di Visual Studio 2019
ASP.NET Core
3.0 o versione successiva

L'autenticazione dei cookie può essere usata in .NET Core 2.2 o versioni precedenti, ma i suggerimenti includono codice specifico per .NET Core 3.0 e versioni successive.

In un primo momento

ASP.NET Core utilizza l'autenticazione dei cookie come meccanismo di autenticazione dell'accesso. È possibile considerare l'autenticazione dei cookie come qualcosa di simile all'autenticazione basata su form tradizionale.

Un altro modo per autenticare ASP.NET Core è ASP.NET'identità di base. Oltre all'autenticazione tramite moduli, autenticazione api, servizi di accesso esterno, gestione e reimpostazione delle password, ecc. È possibile utilizzare molte funzioni. Tuttavia, dal punto di vista di solo fare una semplice schermata di login questa volta, diventa un meccanismo di un po 'esagerato autenticazione Io non lo uso in questo momento.

Nei suggerimenti per l'autenticazione dei cookie, non è possibile visualizzare nulla di diverso dalla schermata di accesso a meno che non si accede. Se si tenta di andare a una schermata diversa, si verrà reindirizzati alla schermata di accesso. Puoi anche vedere altre schermate effettuando l'accesso.

Una volta inseriti il nome utente e la password nella schermata di accesso, è possibile effettuare l'accesso. L'autenticazione dell'utente stesso viene implementata in una posizione temporanea. Poiché l'implementazione principale dell'autenticazione dei cookie è all'ultima volta, il processo di giudizio, ad esempio se la password è corretta, non è essenziale.

Questo suggerimento elenca il programma in modo spartato. Scarica il programma completo per il codice completo.

Creare un progetto

Avviare Visual Studio e creare un nuovo progetto.

image

selezionare ASP.NETapplicazione Web principale.

image

Specificare il nome e il percorso del progetto.

image

Questa volta, useremo i progetti mvc, ma la maggior parte degli altri modelli può essere sostituita.

Per l'autenticazione, selezionare Nessuna autenticazione. Se si sceglie un'altra autenticazione, si utilizzerà ASP.NET identità di base.

image

Dopo aver creato un progetto ed eseguirne il debug, viene visualizzata la schermata nella figura seguente. Creeremo un programma basato su questa schermata.

image

Modifica Startup.cs

Startup.cs aggiungere le definizioni necessarie per l'autenticazione dei cookie. Gli spazi dei nomi usano:Namespaces use:

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;

È possibile abilitare l'autenticazione cookie eseguendo i metodi AddAuthentication e AddCookie. Specificare CookieAuthenticationDefaults.AuthenticationScheme se non è necessario modificare in particolare il nome dello schema.

Opzioni del metodo addauthorization. Se si specifica RequireAuthenticatedUser in FallbackPolicy, A tutti i controller può essere applicato un criterio richiesto per l'autenticazione all'azione. È utile anche nel senso che il codice viene ridotto e l'errore di descrizione viene impedito se è richiesta l'autenticazione diversa dalla schermata di accesso. Solo la schermata di accesso scriverà il codice che non richiede l'autenticazione singolarmente.

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

Aggiungere l'autenticazione all'applicazione. Aggiungi UseAuthentication(). Il percorso della descrizione si basa sulla documentazione MSDN. Posizionare davanti a UseAuthorization(). Tutto il resto rimane un modello.

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

Creazione di un AccountControllerCreating an AccountController

Creare i controller e le azioni necessarie per creare una schermata di accesso. Il nome del controller viene creato come AccountController.The controller name is created as AccountController. Questo perché, per impostazione predefinita, il nome del controller e il nome dell'azione della schermata di accesso sono determinati come "/Account/Login". Se si desidera modificare questo percorso, è possibile modificarlo con le opzioni del AddCookie metodo in Startup.cs. Andremo attraverso con le impostazioni predefinite.

image

Il primo passaggio consiste nel creare il lato controller. Concedendo l'attributo AllowAnonymous, tutte le azioni in esso contenuto possono essere eseguite anche se non sono autenticate. In questo modo è possibile accedere solo alla schermata di accesso senza autenticazione.

L'attributo AllowAnonymous è indipendente dall'autenticazione dei cookie come posizione diversa dalla schermata di accesso. Può anche essere utilizzato su controller solo 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
  {
  }
}

Definire gli utenti e le password a cui è possibile effettuare l'accesso. Originariamente lo salvo in un database, ma questa volta il giudizio dell'utente non è l'obiettivo principale Lo faccio da un set temporaneo.

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

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

Si tratta di un'azione per visualizzare la schermata di accesso. Restituire la vista così com'è perché viene visualizzata solo.

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

Processo di autenticazione dopo aver premuto il pulsante di accesso. Se il nome utente e la password corrispondono, può essere autenticato.

Il codice seguente definisce attestazione, identità e Pricinpal come codice minimo richiesto per l'autenticazione. La chiamata al metodo HttpContext.SignInAsync genera un cookie e lo autentica.

Se sono necessarie attestazioni aggiuntive o i cookie scadono, aggiungere parametri.

Dopo aver effettuato l'accesso, è stato reindirizzato a / Home / Index, che richiede l'autenticazione.

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

Immettere il processo di disconnessione. È possibile eliminare un cookie e riportarlo a uno stato non registrato chiamando il HttpContext.SignOutAsync metodo.

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

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

Creare una visualizzazione (modulo di accesso) (/Views/Account/Login.cshtml)

Dal momento che non ne prendiamo in considerazione, aggiungi un campo per inserire il tuo nome utente e la password, come mostrato nella figura seguente, e posiziona un pulsante per accedere. È inoltre necessario inserire un collegamento per accedere a Home/Index senza effettuare l'accesso a scopo di test.

Poiché è problematico immettere il nome utente e la password, viene impostato il valore iniziale.

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>

Creare un collegamento di disconnessione (/Views/Shared/_Layout.cshtml)

La schermata iniziale non cambierà nulla, ma avrai un link di disconnessione nella barra di navigazione. Inoltre, inserirò anche un collegamento che passa alla schermata di accesso senza disconnettersi a scopo di 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>
<!-- 中略 -->

Controllare l'operazione

È stata completata l'implementazione minima richiesta per l'autenticazione dei cookie. Prova a farlo e vedere come funziona. Dovrebbe cambiare il comportamento a seconda che tu sia connesso o meno. Come semplice esempio, penso che si può vedere il seguente comportamento.

Operazione - Risultati operazione
Vai a casa senza effettuare l'accesso Reindirizza alla schermata di accesso
Login Vai alla schermata Home
Esci da casa e torna a casa senza effettuare l'accesso Reindirizza alla schermata di accesso
Non uscire di casa e torna a casa senza effettuare l'accesso Vai alla schermata Home