Skapa en mekanism som ska omdirigeras om du inte loggar in med cookie-autentisering (ASP.NET Core 3.0)

Sidan uppdaterad :
Datum för skapande av sida :

Miljö

Visuell studio
  • Visual Studio-gemenskapen 2019
ASP.NET kärna
3.0 eller senare

Cookie-autentisering kan användas i .NET Core 2.2 eller tidigare, men våra tips innehåller kod specifikt för .NET Core 3.0 och senare.

Först

ASP.NET Core använder cookie-autentisering som en inloggningsautentiseringsmekanism. Du kan se cookie-autentisering som något som liknar traditionell formulärautentisering.

Ett annat sätt att autentisera ASP.NET Core är ASP.NET Core Identity. Förutom autentisering med hjälp av formulär, api-autentisering, externa inloggningstjänster, lösenordshantering och återställning, etc. Du kan använda många funktioner. Men ur synvinkel att bara göra en enkel inloggningsskärm den här gången blir det en mekanism för lite överdriven autentisering Jag använder det inte just nu.

I tipsen för cookie-autentisering kan du inte visa något annat än inloggningsskärmen om du inte loggar in. Om du försöker gå till en annan skärm omdirigeras du till inloggningsskärmen. Du kan också se andra skärmar genom att logga in.

När du har angett ditt användarnamn och lösenord på inloggningsskärmen kan du logga in. Autentiseringen av användaren själv implementeras i en tillfällig position. Eftersom huvudimplementeringen av cookie-autentisering är den sista den här gången är bedömningsprocessen, till exempel om lösenordet är korrekt, inte nödvändig.

I det här tipset visas programmet spartly. Ladda ner hela programmet för den fullständiga koden.

Skapa ett projekt

Starta Visual Studio och skapa ett nytt projekt.

image

välj ASP.NET Core Web Application.

image

Ange projektnamn och projektplats.

image

Den här gången använder vi mvc-projekt, men de flesta andra mallar kan ersättas.

För autentisering väljer du Ingen autentisering. Om du väljer annan autentisering använder du ASP.NET Core Identity.

image

När du har skapat ett projekt och felsöker det visas skärmen i bilden nedan. Vi kommer att skapa ett program baserat på denna skärm.

image

Redigera Startup.cs

Startup.cs lägga till de definitioner som krävs för cookie-autentisering. Namnområden använder:

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 aktivera cookie-autentisering genom att köra addauthentication- och AddCookie-metoderna. Ange CookieAuthenticationDefaults.AuthenticationScheme om du inte behöver ändra schemanamnet i synnerhet.

Alternativen för addauthorization-metod. Om du anger RequireAuthenticatedUser i FallbackPolicy, Alla styrenheter kan ha en princip som krävs för autentisering som tillämpas på åtgärden. Det är också användbart i den meningen att koden minskas och beskrivningen misstag förhindras om autentisering krävs annat än inloggningsskärmen. Endast inloggningsskärmen skriver koden som inte kräver autentisering individuellt.

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

Lägg till autentisering i ditt program. Lägg till UseAuthentication(). Beskrivningsplatsen baseras på MSDN-dokumentationen. Placera framför UseAuthorization(). Allt annat förblir en mall.

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

Skapa en accountcontroller

Skapa de styrenheter och åtgärder du behöver för att skapa en inloggningsskärm. Controller-namnet skapas som AccountController. Detta beror på att som standard, controller namn och åtgärd namn på inloggningsskärmen bestäms vara "~ / Konto / Login". Om du vill ändra den här sökvägen kan du ändra den med alternativen för AddCookie-metoden i Startup.cs. Vi går igenom standardinställningarna.

image

Det första steget är att skapa styrenhetssidan. Genom att bevilja attributet AllowAnonymous kan alla åtgärder i det utföras även om de inte autentiseras. Detta gör att endast inloggningsskärmen kan nås utan autentisering.

Attributet AllowAnonymous är oberoende av cookie-autentisering som en annan plats än inloggningsskärmen. Det kan också användas på 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
  {
  }
}

Definiera de användare och lösenord som kan loggas in. Ursprungligen jag spara den till en databas, men den här gången användaren dom är inte huvudfokus Jag klarar mig genom en tillfällig uppsättning.

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

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

Detta är en åtgärd för att visa inloggningsskärmen. Returnera vyn som den är eftersom den bara visas.

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

Autentiseringsprocessen efter att ha tryckt på inloggningsknappen. Om användarnamnet och lösenordet stämmer överens kan det autentiseras.

Följande kod definierar anspråk, identitet och Pricinpal som den minsta kod som krävs för autentisering. Anropar metoden HttpContext.SignInAsync genererar en cookie och autentiserar den.

Om ytterligare anspråk krävs eller om cookies upphör att gälla lägger du till parametrar.

När vi har loggat in har vi omdirigerat till ~/Home/Index, vilket kräver autentisering.

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

Ange utloggningsprocessen. Du kan ta bort en cookie och återställa den till ett ologgat tillstånd genom att anropa metoden HttpContext.SignOutAsync.

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

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

Skapa en vy (inloggningsformulär) (/Visningar/Konto/Login.cshtml)

Eftersom vi inte tar hänsyn till det lägger du till ett fält för att ange ditt användarnamn och lösenord, som visas i bilden nedan, och placera en knapp för att logga in. Du bör också placera en länk för att komma åt Hem/ Index utan att logga in för testning.

Eftersom det är besvärligt att ange användarnamn och lösenord anges det ursprungliga värdet.

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>

Skapa en utloggningslänk (/Visningar/Delad/_Layout.cshtml)

Startskärmen ändrar ingenting, men du har en utloggningslänk i navigeringsfältet. Dessutom ska jag också lägga en länk som övergår till inloggningsskärmen utan att logga ut för teständamå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>
<!-- 中略 -->

Kontrollera åtgärden

Du har nu slutfört den minsta implementering som krävs för cookie-autentisering. Försök att göra det och se hur det fungerar. Det bör ändra beteendet beroende på om du är inloggad eller inte. Som ett enkelt exempel, jag tror du kan se följande beteende.

Operation Drift Resultat
Gå hem utan att logga in Omdirigera till inloggningsskärmen
Logga in Gå till startskärmen
Logga ut hem och gå hem utan att logga in Omdirigera till inloggningsskärmen
Logga inte ut hemifrån och gå hem utan att logga in Gå till startskärmen