Creați un mecanism pentru a fi redirecționat dacă nu vă conectați utilizând autentificarea cookie (ASP.NET Core 3.0)

Pagina actualizată :
Data creării paginii :

Mediu

Discutii pe forum Visual C
  • Comunitatea Visual Studio 2019
ASP.NET Core
3.0 sau o versiune ulterioară

Autentificarea cookie poate fi utilizată în .NET Core 2.2 sau o versiune anterioară, dar sfaturile noastre includ cod special pentru .NET Core 3.0 și versiuni ulterioare.

La început,

ASP.NET Core utilizează autentificarea modulelor cookie ca mecanism de autentificare. Vă puteți gândi la autentificarea modulelor cookie ca la ceva similar cu autentificarea formularelor tradiționale.

Un alt mod de a autentifica ASP.NET Core este ASP.NET Core Identity. În plus față de autentificarea folosind formulare, autentificare API, servicii de conectare externă, gestionarea parolelor și resetare, etc. Puteți utiliza o mulțime de funcții. Cu toate acestea, din punctul de vedere de a face doar un simplu ecran de conectare de data aceasta, acesta devine un mecanism de o autentificare puțin exagerată Eu nu-l folosesc în acest moment.

În sfaturile pentru autentificarea modulelor cookie, nu puteți afișa altceva decât ecranul de conectare decât dacă vă conectați. Dacă încercați să mergeți la un alt ecran, veți fi redirecționat către ecranul de conectare. De asemenea, puteți vedea alte ecrane conectându-vă.

După ce introduceți numele de utilizator și parola pe ecranul de conectare, vă puteți conecta. Autentificarea utilizatorului în sine este implementată într-o poziție temporară. Deoarece punerea în aplicare principală a autentificării cookie-urilor este la ultima de data aceasta, procesul de judecată, ar fi dacă parola este corectă, nu este esențială.

Acest Sfaturi liste de programul spartly. Descărcați programul complet pentru codul complet.

Crearea unui proiect

Porniți Visual Studio și creați un proiect nou.

image

selectați ASP.NET Core Web Application (Aplicație Web core).

image

Specificați orice nume de proiect și locația proiectului.

image

De data aceasta, vom folosi proiecte MVC, dar cele mai multe dintre celelalte template-uri pot fi înlocuite.

Pentru autentificare, selectați Fără autentificare. Dacă alegeți altă autentificare, veți utiliza ASP.NET Identitate core.

image

După ce creați un proiect și îl depanați, apare ecranul din figura de mai jos. Vom crea un program bazat pe acest ecran.

image

Editare Startup.cs

Startup.cs adăugadefinițiile necesare pentru autentificarea modulelor cookie. Utilizarea spațiilor de nume:

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;

Puteți activa autentificarea modulelor cookie executând metodele AddAuthentication și AddCookie. Specificați CookieAuthenticationDefaults.AuthenticationScheme dacă nu este necesar să modificați numele schemei în special.

Opțiunile metodei de adăugare. Dacă specificați RequireAuthenticatedUser în FallbackPolicy, Toți controlerele pot avea o politică necesară de autentificare aplicată acțiunii. De asemenea, este util, în sensul că codul este redus și greșeala descriere este împiedicată dacă autentificarea este necesară, altele decât ecranul de conectare. Numai ecranul de conectare va scrie codul care nu necesită autentificare individual.

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

Adăugați autentificare a aplicației. Adăugare UseAuthentication(). Locația de descriere se bazează pe documentația MSDN. Locul în fața UseAuthorization (). Orice altceva rămâne un șablon.

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

Crearea unui AccountController

Creați controlerele și acțiunile de care aveți nevoie pentru a crea un ecran de conectare. Numele controlerului este creat ca AccountController. Acest lucru se datorează faptului că în mod implicit, numele controlerului și numele acțiunii ecranului de conectare sunt determinate să fie "~/Account/Login". Dacă doriți să modificați această cale, o puteți modifica cu opțiunile metodei AddCookie din Startup.cs. Vom merge până la capăt cu setările implicite.

image

Primul pas este de a crea partea controlerului. Prin acordarea atributului AllowAnonymous, toate acțiunile din acesta pot fi efectuate chiar dacă nu sunt autentificate. Acest lucru permite doar ecranul de conectare pentru a fi accesate fără autentificare.

Atributul AllowAnonymous este independent de autentificarea modulelor cookie ca o altă locație decât ecranul de conectare. Acesta poate fi, de asemenea, utilizat pe controlere doar 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
  {
  }
}

Definiți utilizatorii și parolele care pot fi conectate. Inițial i a salva it la o bază de date, dar de data aceasta hotărârea utilizatorului nu este accentul principal O fac cu un set temporar.

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

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

Aceasta este o acțiune pentru a afișa ecranul de conectare. Returnați vizualizarea așa este, deoarece se afișează numai.

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

Procesul de autentificare după apăsarea butonului de conectare. Dacă numele de utilizator și parola se potrivesc, acesta poate fi autentificat.

Următorul cod definește revendicarea, identitatea și Pricinpal ca fiind codul minim necesar pentru autentificare. Apelarea metodei HttpContext.SignInAsync generează un cookie și o autentifică.

Dacă sunt necesare revendicări suplimentare sau modulele cookie expiră, adăugați parametri.

După conectare, am redirecționat către ~/Home/Index, care necesită autentificare.

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

Introduceți procesul de deconectare. Aveți posibilitatea să ștergeți un cookie și să-l readuceți la o stare neconectată apelând metoda HttpContext.SignOutAsync.

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

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

Crearea unei vizualizări (formular de conectare) (/Vizualizări/Cont/Login.cshtml)

Deoarece nu îl luăm în considerare, adăugați un câmp pentru a introduce numele de utilizator și parola, așa se arată în figura de mai jos, și plasați un buton pentru a vă conecta. De asemenea, ar trebui să plasați un link pentru a accesa Home / Index, fără logare în scopuri de testare.

Deoarece este supărător pentru a introduce numele de utilizator și parola, valoarea inițială este setat.

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>

Crearea unui link de deconectare (/Vizualizări/Shared/_Layout.cshtml)

Ecranul de pornire nu va schimba nimic, dar veți avea un link de deconectare în bara de navigare. Înăuntru addition, ll' de asemenea a pune un link that transitions la login ecran fără logging afară pentru testing purposes.

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

Verificarea funcționării

Acum ați finalizat implementarea minimă necesară pentru autentificarea modulelor cookie. Încercați să o facă și a vedea funcționează. Ar trebui să modificați comportamentul în funcție de dacă sunteți conectat sau nu. Ca un exemplu simplu, cred că puteți vedea următorul comportament.

Operațiunea Rezultatele operațiunii
Du-te acasă fără să te conectezi. Redirecționare la ecranul de conectare
Login Accesați Ecranul principal
Deconectează-te de acasă și du-te acasă fără logare Redirecționare la ecranul de conectare
Nu vă deconectați de acasă și mergeți acasă fără să vă conectați Accesați Ecranul principal