Ustvarite mehanizem za preusmeritev, če se ne prijavite s preverjanjem pristnosti piškotkov (ASP.NET Core 3.0)

Stran posodobljena :
Datum ustvarjanja strani :

Okolje

Vizualni Studio
  • Visual Studio Skupnosti 2019
ASP.NET jedro
3,0 ali novejši

Preverjanje pristnosti piškotkov se lahko uporablja v .NET Core 2,2 ali starejših, vendar naši namigi vsebujejo kodo, posebej za .NET Core 3,0 in novejše.

Sprva

ASP.NET Core uporablja preverjanje pristnosti piškotkov kot mehanizem za prijavo pristnosti . Preverjanje pristnosti piškotkov si lahko ogledate kot nekaj podobnega za običajne avtentikacije obrazcev.

Drug način za avtentikacijo ASP.NET Core je ASP.NET Core Identity. Poleg avtentikacije z obrazci, API avtentikacijo, zunanje storitve za prijavo, upravljanje z geslom in reset, itd Uporabite lahko veliko funkcij. Vendar pa z vidika samo kar preprost prijavni zaslon tokrat, postane mehanizem malo pretiranega avtentikacije Ne uporabljam je v tem trenutku.

Pri nasvetih za preverjanje pristnosti piškotkov ne morete prikazati ničesar drugega kot prijavni zaslon, razen če se prijavite. Če poskušate iti na drug zaslon, boste preusmerjeni na prijavni zaslon. Druge zaslone si lahko ogledate tudi tako, da se prijavite.

Ko vnesete uporabniško ime in geslo na prijavni zaslon, se lahko prijavite. Avtentikacija samega uporabnika se izvaja v začasnem položaju. Ker je glavno izvajanje avtentikacije piškotkov zadnje tokrat, postopek presoje, na primer, ali je geslo pravilno, ni nujen.

Ta Nasveti seznam program spartly. Prenesite celoten program za celotno kodo.

Ustvarjanje projekta

Zaženite Visual Studio in ustvarite nov projekt.

image

izberite ASP.net Core Web Application.

image

Navedite ime projekta in lokacijo projekta.

image

Tokrat bomo uporabili MVC projekte, vendar je večina drugih predlog mogoče nadomestiti.

Za preverjanje pristnosti Izberite brez preverjanja pristnosti. Če izberete drugo preverjanje pristnosti, boste uporabili ASP.NET Core Identity.

image

Ko ustvarite projekt in ga razhroščujete, se prikaže zaslon na spodnji sliki. Ustvarili bomo program, ki temelji na tem zaslonu.

image

Uredi Startup.cs

Startup.cs dodati definicije, potrebne za preverjanje pristnosti piškotkov. Imenski prostori uporabljajo:

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;

Preverjanje pristnosti piškotkov lahko omogočite tako, da zaženete metode AddAuthentication in AddCookie. Določite program CookieAuthenticationDefaults. AuthenticationScheme, če vam ni treba spremeniti imena sheme posebej.

Možnosti addauthorization metode. Če navedete RequireAuthenticatedUser v FallbackPolicy, Vsi krmilniki imajo lahko potrebno preverjanje pristnosti, ki se uporablja za dejanje. Prav tako je koristno v smislu, da je koda zmanjšana in opis napaka je preprečena, če je potrebno preverjanje pristnosti, razen prijavni zaslon. Samo prijavni zaslon bo napisal kodo, ki ne zahteva avtentikacije posamično.

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

V aplikacijo dodajte preverjanje pristnosti . Dodajanje preverjanja pristnosti (). Opis lokacija temelji na dokumentaciji MSDN. Mesto pred UseAuthorization (). Vse ostalo je še vedno predloga.

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

Ustvarjanje AccountController

Ustvarite krmilnike in dejanja, ki jih potrebujete za ustvarjanje prijavnega zaslona. Ime kontrolnika je ustvarjeno kot AccountController. To je zato ker z ne izpolniti obveznosti, ime upravljavca ter dejanje ime od prepričevalnost zaslon ste odločen v obstati "~/Account/login". Če želite spremeniti to pot, jo lahko spremenite z možnostmi AddCookie metode v Startup.cs. Šli bomo skozi privzete nastavitve.

image

Prvi korak je, da ustvarite krmilnik strani. Z dodelitvijo atributa Allowanonymous se lahko vsa dejanja v njem izvedejo tudi, če niso preverjena. To omogoča dostop do uporabniškega zaslona brez preverjanja pristnosti.

Atribut Allowanonymous je neodvisen od avtentikacije piškotkov kot mesto, ki ni prijavni zaslon. Uporablja se lahko tudi na krmilnikih, ki so samo 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
  {
  }
}

Definirajte uporabnike in gesla, ki jih je mogoče prijaviti. Uvodoma jaz zaščititi to v a časovno določljiv, šele to čas uporabnik sodna odločba ni najvažnejši žarišče To sem naredila z začasnim zakom.

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

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

To je dejanje za prikaz prijavnega zaslona. Vrnite pogled, ker je prikazan samo.

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

Postopek preverjanja pristnosti po pritisku na gumb za prijavo. Če se uporabniško ime in geslo ujemata, se lahko overi.

Naslednja koda definira zahtevek, identiteto in Pricinpal kot minimalno kodo, potrebno za preverjanje pristnosti. Klicanje metode HttpContext. SignInAsync ustvari piškotek in ga potrdi.

Če so zahtevani dodatni zahtevki ali pa piškotki potečejo, dodajte parametre.

Po prijavi, smo preusmerjeni na ~/Home/Index, ki zahteva avtentikacijo.

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

Vnesite postopek logout. Piškotek lahko izbrišete in ga vrnete v neprijavljen stanje tako, da pokličete metodo HttpContext. SignOutAsync.

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

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

Ustvarjanje pogleda (prijavni obrazec) (/Views/Account/Login.cshtml)

Ker ga ne upoštevamo, dodajte polje za vnos uporabniškega imena in gesla, kot je prikazano na spodnji sliki, in postavite gumb za prijavo. Vi should tudi mesto a člen v postranski dom/indeks če ne drvarsko delo zakaj preskušnja namen.

Ker je težavno vnesti uporabniško ime in geslo, je nastavljena začetna vrednost.

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>

Ustvarjanje logout povezave (/Views/Shared/_Layout. cshtml)

Domači zaslon ne bo ničesar spremenil, vendar boste v vrstici za krmarjenje imeli povezavo za odjavo. Poleg tega bom tudi dal link, ki prehode na prijavni zaslon, ne da bi odjavili za namene testiranja.

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

Preverite delovanje

Zdaj ste zaključili minimalno izvajanje, potrebno za preverjanje pristnosti piškotkov. Poskusite to storiti in videli, kako deluje. To bi moralo spremeniti obnašanje glede na to, ali ste prijavljeni ali ne. Kot preprost primer, mislim, da lahko vidite naslednje obnašanje.

Operacija Rezultati operacije
Pojdi domov, ne da bi se prijavili v Preusmeritev na prijavni zaslon
Prijavo Pojdi na začetni zaslon
Odjavite se iz doma in pojdite domov, ne da bi se prijavili v Preusmeritev na prijavni zaslon
Ne Odjavite se iz doma in pojdite domov, ne da bi se prijavili v Pojdi na začetni zaslon