Looge mehhanism, mis suunatakse ümber, kui te ei logi sisse küpsiste autentimisega (ASP.NET Core 3.0)

Lehekülg uuendatud :
Lehe loomise kuupäev :

Keskkond

Visual Studio
  • Visual Studio kogukonna 2019
ASP.NET tuum
3,0 või uuem versioon

Küpsiste autentimist saab kasutada .NET Core 2,2 või varem, kuid meie nõuanded sisaldavad konkreetselt .NET Core 3,0 ja uuemate versioonide koodi.

Alguses

ASP.NET Core kasutab küpsiste autentimine sisselogimise autentimise mehhanism. Võite mõelda küpsise autentimine midagi sarnast traditsiooniliste vormide autentimine.

Teine viis autentimiseks ASP.NET Core on ASP.NET Core Identity. Lisaks autentimine kasutades vorme, API autentimine, välise sisselogimise teenused, Password Management ja reset, jne. Saate kasutada palju funktsioone. Aga, vaatenurgast lihtsalt teha lihtsa sisselogimise ekraan seekord, see muutub mehhanism veidi liialdatud autentimine Ma ei kasuta seda seekord.

Küpsiste autentimise nõuanded ei saa kuvada midagi muud peale sisselogimiskuva, kui logite sisse. Kui püüate minna teise ekraani, siis suunatakse teid sisselogimise ekraanile. Samuti saate vaadata teisi ekraane, logides sisse.

Kui sisestate sisselogimiskuval oma kasutajanime ja parooli, saate sisse logida. Kasutaja enda autentimine on rakendatud ajutises asendis. Kuna küpsiste autentimise peamine rakendamine on Viimane seekord, ei ole otsustusprotsess, näiteks kas parool on õige, hädavajalik.

See nõuanne loetleb programmi sosaliselt. Täieliku koodi täielik programm alla laadida.

Projekti loomine

Käivitage Visual Studio ja looge uus projekt.

image

valige ASP.net Core veebirakendus.

image

Saate määrata projekti nime ja projekti asukoha.

image

Seekord kasutame MVC projekte, kuid enamikku teistest mallidest saab asendada.

Autentimise puhul valige autentimine puudub. Kui valite muu autentimise, siis kasutate ASP.NET Core identiteeti.

image

Pärast projekti loomist ja siluda, kuvatakse alloleval joonisel kuvatav pilt. Me loome programmi, mis põhineb sellel ekraanil.

image

Redigeeri Startup.cs

Startup.cs lisada küpsise autentimiseks nõutavad määratlused. Nimeruumid kasutamine:

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;

Küpsiste autentimist saate lubada, käivitades AddAuthentication ja AddCookie meetodid. Määrake Cookieauthenticationvaikesätted. AuthenticationScheme, kui te ei pea muutma skeemi nime eriti.

Addautoriseerimismeetodi suvandid. Kui määrate RequireAuthenticatedUser on FallbackPolicy, Kõik kontrollerid võivad olla toiminguga seotud autentimise nõutav poliitika. See on kasulik ka selles mõttes, et kood on vähendatud ja kirjeldus viga on välistatud, kui autentimine on nõutav muud kui sisselogimiskuva. Ainult sisselogimise ekraan kirjutab koodi, mis ei nõua autentimist individuaalselt.

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

Lisage taotlusele autentimine. Lisage Useautentimine (). Kirjeldus asukoht põhineb MSDN-i dokumentatsioonist. Koht Useautoriseerimise () ees. Kõik muu jääb malli.

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

AccountController loomine

Looge kontrollerid ja toimingud, mida vajate sisselogimiskuva loomiseks. Kontrolleri nimi luuakse AccountController. Seda sellepärast, et vaikimisi on kontrolleri nimi ja sisselogimise ekraani toimingu nimi on määratud olema "~/Account/Login". Kui soovite seda teed muuta, saate seda muuta AddCookie meetodi suvanditega Startup.cs. Me läheme läbi vaikesäteteks.

image

Esimene samm on luua kontroller pool. Andes Allowanonymous atribuut, kõik toimingud seda saab teha isegi siis, kui nad on autenditud. See võimaldab ainult sisselogimiskuval pääseb ilma autentimist.

Allowanonymous atribuut on sõltumatu küpsise autentimine asukohta, mis ei ole sisselogimiskuva. Seda võib kasutada ka API-ainult kontrollerid.

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

Määratlege kasutajad ja paroolid, mida saab sisse logida. Algselt ma salvestada andmebaasi, kuid seekord kasutaja otsus ei ole peamine fookus Ma teen selle ajutise komplekti järgi.

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

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

See on toiming sisselogimiskuva kuvamiseks. Tagastage vaade nii, nagu see on kuvatud.

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

Autentimise protsessi pärast vajutades login nuppu. Kui kasutajanimi ja parool kattuvad, saab seda autentida.

Järgmine kood määratleb nõude, identiteedi ja Pricinpal autentimise jaoks vajaliku minimaalse koodi. HttpContext. SignInAsync meetodi kutsumine loob küpsise ja autendub seda.

Kui nõutavad on lisanõuded või küpsised aeguvad, lisage parameetrid.

Pärast sisselogimist oleme ümber ~/Home/index, mis nõuab autentimist.

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

Sisestage logimisprotsess. Saate kustutada küpsise ja tagastada see unlogitud olekusse, kutsudes HttpContext. SignOutAsync meetod.

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

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

Vaate loomine (sisselogimisvorm) (/Views/Account/Login.cshtml)

Kuna me seda arvesse ei võta, lisage oma kasutajanime ja parooli sisestamiseks väli, nagu on näidatud alltoodud joonisel, ja asetage nupp sisselogimiseks. Samuti peaksite tegema lingi, et kasutada kodu/indeksit ilma testimise eesmärgil sisse logimata.

Kuna kasutajanimi ja parool on murettekitav, seatakse Algne väärtus.

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>

Logi välja lingi loomine (/views/Shared/_Layout. cshtml)

Avakuva ei muuda midagi, kuid navigeerimisribal on Logi välja link. Lisaks, ma panen ka link, mis siirdeid sisselogimise ekraani ilma väljalogimist testimise eesmärgil.

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

Kontrolli toimingut

Olete nüüd läbinud küpsiste autentimise jaoks vajaliku minimaalse rakendamise. Püüa seda teha ja näha, kuidas see toimib. See peaks muutma käitumist sõltuvalt sellest, kas olete sisse logitud või mitte. Lihtsa näitena leian, et näete järgmist käitumist.

Operatsioon operatsiooni tulemused
Mine koju sisse logimata Ümbersuunamine sisselogimise ekraanile
Login Mine avakuvale
Logige kodust välja ja koju sisse logimata Ümbersuunamine sisselogimise ekraanile
Ära Logi kodust välja ja Mine koju ilma sisse logimata Mine avakuvale