Maak een mechanisme dat moet worden omgeleid als u zich niet aanmeldt met cookieverificatie (ASP.NET Core 3.0)

Pagina bijgewerkt :
Aanmaakdatum van pagina :

Milieu

Visual Studio
  • Visual Studio Community 2019
ASP.NET Kern
3.0 of hoger

Cookieverificatie kan worden gebruikt in .NET Core 2.2 of eerder, maar onze tips bevatten code specifiek voor .NET Core 3.0 en hoger.

In eerste instantie

ASP.NET Core gebruikt cookieverificatie als inlogverificatiemechanisme. U cookieverificatie zien als iets dat lijkt op traditionele formulierenverificatie.

Een andere manier om ASP.NET Core te verifiëren is ASP.NET Core Identity. Naast authenticatie met formulieren, api authenticatie, externe inlogdiensten, wachtwoordbeheer en reset, etc. U veel functies gebruiken. Echter, vanuit het oogpunt van gewoon het maken van een eenvoudige login-scherm deze keer, wordt het een mechanisme van een beetje overdreven authenticatie Ik gebruik het niet op dit moment.

In de tips voor cookieverificatie kun je niets anders dan het inlogscherm weergeven, tenzij je inlogt. Als u naar een ander scherm probeert te gaan, wordt u doorgestuurd naar het inlogscherm. U ook andere schermen zien door in te loggen.

Zodra u uw gebruikersnaam en wachtwoord invoert op het inlogscherm, u inloggen. De authenticatie van de gebruiker zelf wordt in een tijdelijke positie geïmplementeerd. Aangezien de belangrijkste implementatie van cookieauthenticatie deze keer tot het laatst is, is het beoordelingsproces, zoals de vraag of het wachtwoord juist is, niet essentieel.

Deze tips geven een overzicht van het programma. Download het volledige programma voor de volledige code.

Een project maken

Start Visual Studio en maak een nieuw project.

image

selecteer ASP.NET Kernwebtoepassing.

image

Geef een projectnaam en projectlocatie op.

image

Deze keer gebruiken we mvc-projecten, maar de meeste andere sjablonen kunnen worden vervangen.

Selecteer geen verificatie voor verificatie. Als u voor andere verificatie kiest, gebruikt u ASP.NET Kernidentiteit.

image

Nadat u een project hebt gemaakt en debuggen, wordt het scherm in de onderstaande afbeelding weergegeven. We maken een programma op basis van dit scherm.

image

Bewerk Startup.cs

Startup.cs de definities toevoegen die nodig zijn voor cookieverificatie. Gebruik naamruimten:

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;

U cookieverificatie inschakelen door de methoden AddAuthentication en AddCookie uit te voeren. Geef CookieAuthenticationDefaults.AuthenticationScheme op als u de schemanaam niet in het bijzonder hoeft te wijzigen.

De opties voor de machtigingsmethode toevoegen. Als u VereistGeverifieerdeGebruiker opgeeft in FallbackPolicy, Alle controllers kunnen een verificatiebeleid toepassen op de actie. Het is ook nuttig in de zin dat de code wordt verminderd en de beschrijvingfout wordt voorkomen als verificatie anders dan het inlogscherm vereist is. Alleen het inlogscherm schrijft de code waarvoor geen verificatie afzonderlijk nodig is.

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

Voeg verificatie toe aan uw toepassing. UseAuthentication() toevoegen. De beschrijvingslocatie is gebaseerd op de MSDN-documentatie. Plaats voor UseAuthorization(). Al het andere blijft een sjabloon.

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

Een AccountController maken

Maak de controllers en acties die u nodig hebt om een inlogscherm te maken. De naam van de controller wordt gemaakt als AccountController. Dit komt omdat standaard, de controller naam en actie naam van het inlogscherm zijn bepaald als "~/Account / Login". Als u dit pad wilt wijzigen, u dit wijzigen met de opties van de methode AddCookie in Startup.cs. We gaan door met de standaardinstellingen.

image

De eerste stap is het creëren van de controller kant. Door het kenmerk AllowAnonymous toe te kennen, kunnen alle acties die erin staan worden uitgevoerd, zelfs als ze niet zijn geverifieerd. Hierdoor kan alleen het inlogscherm worden geopend zonder verificatie.

Het kenmerk AllowAnonymous is onafhankelijk van cookieverificatie als een andere locatie dan het inlogscherm. Het kan ook worden gebruikt op api-only controllers.

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

Definieer de gebruikers en wachtwoorden die kunnen worden aangemeld. Oorspronkelijk sla ik het op in een database, maar deze keer is het oordeel van de gebruiker niet de belangrijkste focus Ik maak het door een tijdelijke set.

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

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

Dit is een actie om het inlogscherm weer te geven. Retourneer de weergave zoals deze is omdat deze alleen wordt weergegeven.

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

Verificatieproces na het indrukken van de inlogknop. Als de gebruikersnaam en het wachtwoord overeenkomen, kan deze worden geverifieerd.

De volgende code definieert claim, identiteit en Pricinpal als de minimumcode die nodig is voor verificatie. Als u de httpContext.signinasync-methode aanroept, wordt een cookie gegenereerd en wordt deze geverifieerd.

Als er aanvullende claims nodig zijn of cookies verlopen, voegt u parameters toe.

Na het inloggen hebben we doorgestuurd naar ~/Home/Index, waarvoor verificatie vereist is.

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

Voer het afmeldproces in. U een cookie verwijderen en deze naar een niet-geregistreerde status retourneren door de httpContext.SignOutAsync-methode aan te roepen.

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

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

Een weergave maken (aanmeldingsformulier) (/Weergaven/Account/Login.cshtml)

Omdat we er geen rekening mee houden, voeg je een veld toe om je gebruikersnaam en wachtwoord in te voeren, zoals in de onderstaande afbeelding staat, en plaats je een knop om in te loggen. U moet ook een link plaatsen om toegang te krijgen tot Home/Index zonder in te loggen voor testdoeleinden.

Omdat het lastig is om de gebruikersnaam en het wachtwoord in te voeren, wordt de oorspronkelijke waarde ingesteld.

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>

Een afmeldingskoppeling maken (/Weergaven/Gedeeld/_Layout.cshtml)

Het startscherm verandert niets, maar je hebt wel een afmeldlink in de navigatiebalk. Daarnaast zal ik ook een link die overstapt naar het inlogscherm zonder uit te loggen voor testdoeleinden.

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

Bewerking controleren

U hebt nu de minimale implementatie voltooid die nodig is voor cookieverificatie. Probeer het te doen en zie hoe het werkt. Het moet het gedrag veranderen, afhankelijk van of u bent ingelogd of niet. Als een eenvoudig voorbeeld, ik denk dat je het volgende gedrag te zien.

Bewerking Bedrijfsresultaten
Naar huis gaan zonder in te loggen Omleiden naar inlogscherm
Login Naar startscherm gaan
Meld je thuis af en ga naar huis zonder in te loggen Omleiden naar inlogscherm
Niet uitloggen thuis en naar huis gaan zonder in te loggen Naar startscherm gaan