Opret en mekanisme, der skal omdirigeres, hvis du ikke logger ind ved hjælp af cookiegodkendelse (ASP.NET Core 3.0)

Side opdateret :
Dato for oprettelse af side :

Miljø

Visual Studio
  • Visual Studio Fællesskabet 2019
ASP.NET kerne
3.0 eller nyere

Cookiegodkendelse kan bruges i .NET Core 2.2 eller tidligere, men vores tip indeholder kode specifikt til .NET Core 3.0 og nyere.

I første omgang

ASP.NET Core bruger cookiegodkendelse som en logingodkendelsesmekanisme. Du kan tænke på cookie-godkendelse som noget, der ligner traditionel formulargodkendelse.

En anden måde at godkende ASP.NET Core på er ASP.NET Core Identity. Ud over godkendelse ved hjælp af formularer, API-godkendelse, eksterne login-tjenester, password management og reset, osv. Du kan bruge en masse funktioner. Men set ud fra blot at lave en simpel login-skærm denne gang, bliver det en mekanisme af en lidt overdrevet autentificering Jeg bruger det ikke på nuværende tidspunkt.

I tips til cookie-godkendelse, kan du ikke vise andet end login-skærmen, medmindre du logger ind. Hvis du forsøger at gå til en anden skærm, vil du blive omdirigeret til login-skærmen. Du kan også se andre skærmbilleder ved at logge på.

Når du har indtastet dit brugernavn og din adgangskode på login-skærmen, kan du logge ind. Godkendelsen af selve brugeren implementeres i en midlertidig position. Da den vigtigste gennemførelse af cookie autentificering er til det sidste denne gang, dommen proces, såsom om adgangskoden er korrekt, er ikke afgørende.

Dette tip viser programmet spartly. Hent hele programmet for den komplette kode.

Oprette et projekt

Start Visual Studio, og opret et nyt projekt.

image

vælge ASP.NET Kernewebprogram.

image

Angiv et projektnavn og en projektplacering.

image

Denne gang bruger vi mvc-projekter, men de fleste af de andre skabeloner kan erstattes.

Vælg Ingen godkendelse til godkendelse. Hvis du vælger anden godkendelse, skal du bruge ASP.NET Core Identity.

image

Når du har oprettet et projekt og fejlfundet det, vises skærmen i figuren nedenfor. Vi vil oprette et program baseret på denne skærm.

image

Rediger Startup.cs

Startup.cs tilføje de definitioner, der kræves til cookiegodkendelse. Brug af navneområder:

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;

Du kan aktivere cookiegodkendelse ved at køre metoderne AddAuthentication og AddCookie. Angiv CookieAuthenticationDefaults.AuthenticationScheme, hvis du ikke behøver at ændre skemanavnet i særdeleshed.

Indstillingerne for addauthorization-metoden. Hvis du angiver RequireAuthenticatedUser i FallbackPolicy, Alle controllere kan have en politik, der kræves af godkendelse, på handlingen. Det er også nyttigt i den forstand, at koden er reduceret, og beskrivelsen fejl forhindres, hvis godkendelse er påkrævet andet end login-skærmen. Det er kun loginskærmen, der skriver den kode, der ikke kræver godkendelse individuelt.

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øj godkendelse til dit program. Tilføj UseAuthentication(). Beskrivelsesplaceringen er baseret på msdn-dokumentationen. Placer foran UseAuthorization(). Alt andet forbliver en skabelon.

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

Oprette en AccountController

Opret de controllere og handlinger, du skal bruge for at oprette en login-skærm. Controllernavnet oprettes som AccountController. Dette skyldes, at controllerens navn og handlingsnavn på loginskærmen som standard vurderes at være "~/Konto/Login". Hvis du vil ændre denne sti, kan du ændre den med indstillingerne for metoden AddCookie i Startup.cs. Vi gennemgår standardindstillingerne.

image

Det første skridt er at oprette controlleren side. Ved at tildele attributten AllowAnonymous kan alle handlinger i den udføres, selvom de ikke er godkendt. Dette gør det kun muligt at få adgang til loginskærmen uden godkendelse.

Attributten AllowAnonymous er uafhængig af cookie-godkendelse som et andet sted end loginskærmen. Det kan også bruges på api-only controllere.

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

Definer de brugere og adgangskoder, der kan være logget på. Oprindeligt jeg gemme det til en database, men denne gang brugeren dom er ikke det vigtigste fokus Jeg gør det ved et midlertidigt sæt.

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

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

Dette er en handling for at vise login-skærmen. Returner visningen, som den er, fordi den kun vises.

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

Godkendelsesprocessen efter at have trykket på login-knappen. Hvis brugernavnet og adgangskoden stemmer overens, kan det godkendes.

Følgende kode definerer krav, identitet og Pricinpal som den mindste kode, der kræves til godkendelse. Når du kalder metoden HttpContext.SignInAsync, genereres en cookie og godkendes den.

Hvis der kræves yderligere krav, eller cookies udløber, skal du tilføje parametre.

Når du er logget ind, har vi omdirigeret til ~/Home/Index, hvilket kræver godkendelse.

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

Angiv logoutprocessen. Du kan slette en cookie og returnere den til en tilstand, der ikke er logget, ved at kalde metoden HttpContext.SignOutAsync.

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

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

Oprette en visning (loginformular) (/Visninger/Konto/Login.cshtml)

Da vi ikke tager højde for det, skal du tilføje et felt for at indtaste dit brugernavn og din adgangskode, som vist i figuren nedenfor, og placere en knap til at logge på. Du bør også placere et link for at få adgang til Home/Index uden at logge ind til testformål.

Da det er besværligt at indtaste brugernavn og adgangskode, angives den oprindelige værdi.

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>

Oprette et logoutlink (/Visninger/Delt/_Layout.cshtml)

Startskærmen ændrer ikke noget, men du har et logoutlink på navigationslinjen. Desuden vil jeg også sætte et link, der overgange til login-skærmen uden at logge ud til testformål.

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

Kontrol af handling

Du har nu fuldført den minimumimplementering, der kræves til cookiegodkendelse. Prøv at gøre det og se, hvordan det virker. Det bør ændre adfærd, afhængigt af om du er logget ind eller ej. Som et simpelt eksempel, jeg tror, du kan se følgende adfærd.

Operation Driftsresultater
Gå hjem uden at logge ind Omdiriger til login-skærm
Login Gå til startskærm
Log ud af hjemmet og gå hjem uden at logge ind Omdiriger til login-skærm
Må ikke logge ud af hjemmet og gå hjem uden at logge ind Gå til startskærm