Izveidojiet pieteikšanās mehānismu, izmantojot sīkfailu autentifikāciju, un izveidojiet mehānismu, kas tiks novirzīts, ja neesat autentificēts

Lapa atjaunota :
Lapas izveides datums :

Darbības vide

Visual Studio
  • Visual Studio kopiena 2022
ASP.NET Kodols (MVC, Razor Pages)
6.0

Sākumā

Šoreiz ASP.NET Core izmantos sīkfailu autentifikāciju kā pieteikšanās autentifikācijas mehānismu. Sīkdatņu autentifikāciju var uzskatīt par līdzīgu tradicionālajai veidlapu autentifikācijai.

Vēl viens ASP.NET Core autentifikācijas mehānisms ir ASP.NET Core Identity. Papildus autentifikācijai, izmantojot veidlapas, tas ļauj autentificēties ar API, izmantot ārējos pieteikšanās pakalpojumus, pārvaldīt un atiestatīt paroles utt. Jūs varat izmantot daudz funkciju. Tomēr no tā viedokļa, ka šoreiz ir jāizveido tikai vienkāršs pieteikšanās ekrāns, tas būs nedaudz pārspīlēts autentifikācijas mehānisms. Šoreiz mēs to neizmantosim.

Šoreiz ieviestajos sīkfailu autentifikācijas padomos jūs nevarat parādīt neko citu kā tikai pieteikšanās ekrānu, ja vien neesat pieteicies. Ja mēģināsit pāriet uz citu ekrānu, jūs tiksit novirzīts uz pieteikšanās ekrānu. Ja piesakāties, varat apskatīt citus ekrānus.

Pagaidām jūs varat pieteikties, ievadot savu lietotājvārdu un paroli pieteikšanās ekrānā. Pati lietotāja autentifikācija tiek ieviesta kā pagaidu vieta. Šajā gadījumā galvenā uzmanība tiek pievērsta sīkdatņu autentifikācijas ieviešanai, tāpēc noteikšanas procesa būtība, piemēram, vai parole ir pareiza, nav būtība.

Šis padoms apraksta tikai daļu no programmas. Lai iegūtu pilnu kodu, lejupielādējiet visu programmu. Tas aptver arī gan MVC, gan Razor Pages ietvarus.

Izveidojiet projektu

Startējiet Visual Studio un izveidojiet jaunu projektu.

Razor lapām atlasiet ASP.NET Core Web App vai MVC atlasiet ASP.NET Core Web App (Modelis-Skats-Kontrolleris).

Norādiet izvēlēto projekta nosaukumu un projekta atrašanās vietu.

Autentifikācijas tipam atlasiet "Nav". Ja izvēlaties citu autentifikāciju, jūs izmantosit ASP.NET Core Identity. Kad esat pabeidzis iestatījumus, noklikšķiniet uz pogas "Izveidot".

Pēc projekta izveides, izpildot atkļūdošanu, tiks parādīts zemāk redzamais ekrāns. Mēs izveidosim programmu, pamatojoties uz šo ekrānu.

Rediģēt programmu.cs (Razor Pages, MVC Common)

Pievienojiet sīkfailu autentifikācijai nepieciešamās definīcijas programmai.cs. Pievienojamās nosaukumvietas ir šādas:

using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authorization;

Šeit ir builder.Services kods, ko pievienot .

// === 省略 ===

// 「Razor Pages」のコード
// builder.Services.AddRazorPages();
// 「MVC」のコード
// builder.Services.AddControllersWithViews();

// ※ここから追加

// Cookie による認証スキームを追加する
builder.Services
  .AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
  .AddCookie();

builder.Services.AddAuthorization(options =>
{
  // AllowAnonymous 属性が指定されていないすべての画面、アクションなどに対してユーザー認証が必要となる
  options.FallbackPolicy = new AuthorizationPolicyBuilder()
    .RequireAuthenticatedUser()
    .Build();
});

// ※ここまで追加

var app = builder.Build();

// === 省略 ===

AddAuthenticationAddCookie Jūs varat iespējot sīkdatņu autentifikāciju, izpildot and metodi. Ja shēmas nosaukums nav jāmaina, CookieAuthenticationDefaults.AuthenticationScheme norādiet .

AddAuthorization Ja metodei norādāt options.FallbackPolicy RequireAuthenticatedUser Varat lietot autentifikācijai nepieciešamo politiku visām lapām, visiem kontrolleriem un darbībām. Ja vēlaties pieprasīt autentifikāciju kaut kam citam, izņemot pieteikšanās ekrānu, tā ir noderīga metode, lai samazinātu kodu un novērstu kļūdas aprakstā. Jums būs atsevišķi jāraksta kods, kam nav nepieciešama pieteikšanās ekrāna autentifikācija.

Šis ir app kods .

// === 省略 ===

app.UseRouting();

app.UseAuthentication(); // [追加] 認証
app.UseAuthorization(); // 認可

// 「Razor Pages」のコード
// app.MapRazorPages();
// 「MVC」のコード
// app.MapControllerRoute(
//     name: "default",
//     pattern: "{controller=Home}/{action=Index}/{id?}");

// === 省略 ===

Tā kā mēs vēlamies lietojumprogrammai pievienot autentifikācijas funkcionalitāti, app.UseAuthentication() mēs pievienosim . Apraksta atrašanās vieta ir saskaņā ar MSDN dokumentāciju, lietotni. UseAuthorization(). Izņemot to, tā joprojām ir veidne.

Programmas Razor Pages projektiem

Izveidojiet pieteikšanās lapu (Pages/Account/Login.cshtml.cs)

Faila izveide

Izveidojiet pieteikšanās lapu. Faila ceļš jāizveido kā "/Pages/Account/Login.cshtml". Tas ir tāpēc, ka noklusējuma pieteikšanās ceļš ir tāds. Ja vēlaties mainīt šo ceļu, varat to izdarīt, Program.cs iestatot metodes argumentu AddCookie .

To var izveidot, kopējot citus failus, nevis izveidojot to no izvēlnes, bet tādā gadījumā, lūdzu, pareizi salabojiet programmu.

Ļaujiet lietotājiem piekļūt pieteikšanās lapai bez pieteikšanās

Program.cs Tā kā visām lapām var piekļūt tikai tad, kad esat pieteicies, jums jāiestata tikai pieteikšanās lapa, lai jūs varētu tai piekļūt pat tad, ja neesat pieteicies.

AllowAnonymous Pievienojot atribūtus, mērķa lapai var piekļūt pat tad, ja tā nav autentificēta. AllowAnonymous Atribūtus var izmantot citās vietās, izņemot pieteikšanās ekrānu, piemēram, API darbībās, kas nav saistītas ar sīkfailu autentifikāciju.

using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Security.Claims;

namespace AspNetCoreCookieAuthenticationRazorPages.Pages.Account
{
  [AllowAnonymous]
  public class LoginModel : PageModel
  {
  }
}

Mainīgā izveide ievades saņemšanai

Kad piesakāties, jūs paziņojat savu lietotājvārdu, lai varētu saņemt šīs vērtības, jo ievadāt savu paroli.

// 省略

[AllowAnonymous]
public class LoginModel : PageModel
{
  /// <summary>ユーザー名。</summary>
  [BindProperty]
  [Required]
  [DisplayName("ユーザー名")]
  public string UserName { get; set; } = "";

  /// <summary>パスワード。</summary>
  [BindProperty]
  [Required]
  [DataType(DataType.Password)]
  [DisplayName("パスワード")]
  public string Password { get; set; } = "";
}

Lietotājvārda un paroles definēšana pieteikšanās autentifikācijai

Sākotnēji tas tiktu glabāts datu bāzē utt., bet, tā kā lietotāja spriedums šoreiz nav galvenais fokuss, es to padarīšu par pagaidu vietu.

// 省略

[AllowAnonymous]
public class LoginModel : PageModel
{
  // 省略

  /// <summary>仮のユーザーデータベースとする。</summary>
  private Dictionary<string, string> UserAccounts { get; set; } = new Dictionary<string, string>
    {
      { "user1", "password1" },
      { "user2", "password2" },
    };
}

Pieteikšanās process

/// <summary>ログイン処理。</summary>
public async Task<ActionResult> OnPost()
{
  // 入力内容にエラーがある場合は処理を中断してエラー表示
  if (ModelState.IsValid == false) return Page();

  // ユーザーの存在チェックとパスワードチェック (仮実装)
  // 本 Tips は Cookie 認証ができるかどうかの確認であるため入力内容やパスワードの厳密なチェックは行っていません
  if (UserAccounts.TryGetValue(UserName, out string? getPass) == false || Password != getPass)
  {
    ModelState.AddModelError("", "ユーザー名またはパスワードが一致しません。");
    return Page();
  }

  // サインインに必要なプリンシパルを作る
  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 RedirectToPage("/Index");
}

Tas ir autentifikācijas process pēc pieteikšanās pogas nospiešanas. Ja lietotājvārds un parole sakrīt, autentifikācija ir iespējama.

Aprakstītais kods ir minimālais kods, kas nepieciešams autentifikācijai,ClaimClaimsIdentityClaimsPrincipal un HttpContext.SignInAsync Izsaucot metodi, tiek ģenerēts un autentificēts sīkfails.

Ja ir nepieciešamas papildu pretenzijas vai ir nepieciešams sīkfailu derīguma termiņš, tiek pievienoti papildu parametri.

Pēc pieteikšanās jūs tiekat novirzīts uz , kur /Index nepieciešama autentifikācija.

Atteikšanās process

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

Logout Piekļūstot ar apstrādātāju, tas tiek apstrādāts, lai atteiktos. HttpContext.SignOutAsync Izsaucot šo metodi, jūs varat izdzēst sīkfailu un atgriezt to stāvoklī, kurā neesat pieteicies.

Skata izveide

Mēs neņemam vērā izskatu. Pievienojiet laukus, lai ievadītu savu lietotājvārdu un paroli, kā parādīts zemāk, un ievietojiet pogu, lai pieteiktos. Jums vajadzētu būt arī saitei, lai piekļūtu, nepiesakoties testēšanai /Index .

Tā kā ir apgrūtinoši ievadīt lietotājvārdu un paroli, tiek iestatīta sākotnējā vērtība.

@page
@model AspNetCoreCookieAuthenticationRazorPages.Pages.Account.LoginModel
@{}

<form asp-action="Login">
  <div class="row m-1 g-3">
    <div class="col-sm-6 offset-sm-3">
      <div asp-validation-summary="ModelOnly" class="text-danger"></div>
    </div>
  </div>

  <div class="row m-1 g-3">
    <div class="col-sm-6 offset-sm-3">
      <label asp-for="UserName" class="form-label"></label>
      <input asp-for="UserName" class="form-control" value="user1" />
      <span asp-validation-for="UserName" class="text-danger"></span>
    </div>
  </div>
  <div class="row m-1 g-3">
    <div class="col-sm-6 offset-sm-3">
      <label asp-for="Password" class="form-label"></label>
      <input asp-for="Password" class="form-control" value="password1" />
      <span asp-validation-for="Password" class="text-danger"></span>
    </div>
  </div>
  <div class="row m-1 g-3">
    <div class="col-sm-6 offset-sm-3">
      <button type="submit" class="btn btn-primary">ログイン</button>
    </div>
  </div>
  <div class="row m-1 g-3">
    <div class="col-sm-6 offset-sm-3">
      <a asp-page="/Index">認証が必要な画面へ直接リンク</a>
    </div>
  </div>
</form>

@section Scripts {
  @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
}

Izveidojiet atteikšanās saiti (/Pages/Shared/_Layout.cshtml)

Sākuma ekrānā mēs neveiksim nekādas izmaiņas, bet navigācijas joslā ievietosim atteikšanās saiti. Testēšanai ievietojiet arī saiti, kas novirza jūs uz pieteikšanās ekrānu, neizrakstoties.

<!-- 中略 -->
<div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
  <ul class="navbar-nav flex-grow-1">
    <li class="nav-item">
      <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
    </li>
    <li class="nav-item">
      <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
    </li>
    <!-- ここから追加 -->
    <li class="nav-item">
      <a class="nav-link text-dark" asp-page="/Account/Login" asp-page-handler="Logout">ログアウト</a>
    </li>
    <li class="nav-item">
      <a class="nav-link text-dark" asp-page="/Account/Login">ログアウトせずログインへ</a>
    </li>
    <!-- ここまで追加 -->
  </ul>
</div>
<!-- 中略 -->

Tas attiecas uz Razor Pages kodu.

Programmas MVC projektiem

Pieteikšanās modeļa izveide

Jūs esat izveidojis modeli, lai saņemtu pieteikšanās ekrānā ievadītās vērtības.

namespace AspNetCoreCookieAuthenticationMvc.Models
{
  public class LoginModel
  {
    /// <summary>ユーザー名。</summary>
    [Required]
    [DisplayName("ユーザー名")]
    public string UserName { get; set; } = "";

    /// <summary>パスワード。</summary>
    [Required]
    [DataType(DataType.Password)]
    [DisplayName("パスワード")]
    public string Password { get; set; } = "";
  }
}

Konta kontroliera izveide

Izveidojiet kontrolierus un darbības, kas nepieciešamas, lai izveidotu pieteikšanās ekrānu. Izveidojiet kontrollera nosaukumu AccountController kā . Tas ir tāpēc, ka pēc noklusējuma kontroliera nosaukums un darbības nosaukums pieteikšanās ekrānā ir iestatīts uz "~/Account/Login". Ja vēlaties mainīt šo ceļu, varat to izdarīt metodes opcijās AddCookie programmā Programma.cs. Pagaidām mēs turpināsim ar noklusējuma iestatījumiem.

Vispirms izveidosim kontroliera pusi.

using AspNetCoreCookieAuthenticationMvc.Models;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.Security.Claims;

namespace AspNetCoreCookieAuthenticationMvc.Controllers
{
  /// <remarks>
  /// <see cref="AllowAnonymous"/> 属性は Cookie 認証していなくてもアクセスできる Action (Controller) であることを示す。
  /// </remarks>
  [AllowAnonymous]
  public class AccountController : Controller
  {
  }
}

AllowAnonymous Piešķirot atribūtu, visas tajā esošās darbības var veikt bez autentifikācijas. Tas ļauj piekļūt tikai pieteikšanās ekrānam bez autentifikācijas.

AllowAnonymous Atribūtus var izmantot arī tikai API kontrolleros, kas nav saistīti ar sīkfailu autentifikāciju citās vietās, izņemot pieteikšanās ekrānu.

Pēc tam definējiet lietotājus un paroles, kas var pieteikties. Sākotnēji tas tiktu glabāts datu bāzē utt., bet, tā kā lietotāja spriedums šoreiz nav galvenais fokuss, es to padarīšu par pagaidu vietu.

[AllowAnonymous]
public class AccountController : Controller
{
  /// <summary>仮のユーザーデータベースとする。</summary>
  private Dictionary<string, string> UserAccounts { get; set; } = new Dictionary<string, string>
    {
      { "user1", "password1" },
      { "user2", "password2" },
    };
}

Tālāk ir norādīta darbība, kas parāda pieteikšanās ekrānu. Tā kā tas tiek parādīts tikai, tas atgriež skatu tādu, kāds tas ir.

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

Zemāk ir kods, kas jāapstrādā, piesakoties.

/// <summary>ログイン処理を実行します。</summary>
[HttpPost]
public async Task<IActionResult> Login(LoginModel model)
{
  // 入力内容にエラーがある場合は処理を中断してエラー表示
  if (ModelState.IsValid == false) return View(model);

  // ユーザーの存在チェックとパスワードチェック (仮実装)
  // 本 Tips は Cookie 認証ができるかどうかの確認であるため入力内容やパスワードの厳密なチェックは行っていません
  if (UserAccounts.TryGetValue(model.UserName, out string? getPass) == false || model.Password != getPass)
  {
    ModelState.AddModelError("", "ユーザー名またはパスワードが一致しません。");
    return View(model);
  }

  // サインインに必要なプリンシパルを作る
  var claims = new[] { new Claim(ClaimTypes.Name, model.UserName) };
  var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
  var principal = new ClaimsPrincipal(identity);

  // 認証クッキーをレスポンスに追加
  await HttpContext.SignInAsync(principal);

  // ログインが必要な画面にリダイレクトします
  return RedirectToAction(nameof(HomeController.Index), "Home");
}

Tas ir autentifikācijas process pēc pieteikšanās pogas nospiešanas. Ja lietotājvārds un parole sakrīt, autentifikācija ir iespējama.

Aprakstītais kods ir minimālais kods, kas nepieciešams autentifikācijai,ClaimClaimsIdentityClaimsPrincipal un HttpContext.SignInAsync Izsaucot metodi, tiek ģenerēts un autentificēts sīkfails.

Ja ir nepieciešamas papildu pretenzijas vai ir nepieciešams sīkfailu derīguma termiņš, tiek pievienoti papildu parametri.

Pēc pieteikšanās jūs tiekat novirzīts uz , kur ~/Home/Index nepieciešama autentifikācija.

Visbeidzot, tiek pievienots atteikšanās process.

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

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

HttpContext.SignOutAsync Izsaucot šo metodi, jūs varat izdzēst sīkfailu un atgriezt to stāvoklī, kurā neesat pieteicies.

Skata (pieteikšanās formas) izveide (/Views/Account/Login.cshtml)

Login Ar peles labo pogu noklikšķiniet uz darbības, lai pievienotu skatu. To var arī izveidot, kopējot to no cita faila.

Mēs neņemam vērā izskatu. Pievienojiet laukus, lai ievadītu savu lietotājvārdu un paroli, kā parādīts zemāk, un ievietojiet pogu, lai pieteiktos. Jums vajadzētu būt arī saitei, lai piekļūtu, nepiesakoties testēšanai Home/Index .

Tā kā ir apgrūtinoši ievadīt lietotājvārdu un paroli, tiek iestatīta sākotnējā vērtība.

@model LoginModel
@{}

<form asp-action="Login">
  <div class="row m-1 g-3">
    <div class="col-sm-6 offset-sm-3">
      <div asp-validation-summary="ModelOnly" class="text-danger"></div>
    </div>
  </div>

  <div class="row m-1 g-3">
    <div class="col-sm-6 offset-sm-3">
      <label asp-for="UserName" class="form-label"></label>
      <input asp-for="UserName" class="form-control" value="user1" />
      <span asp-validation-for="UserName" class="text-danger"></span>
    </div>
  </div>
  <div class="row m-1 g-3">
    <div class="col-sm-6 offset-sm-3">
      <label asp-for="Password" class="form-label"></label>
      <input asp-for="Password" class="form-control" value="password1" />
      <span asp-validation-for="Password" class="text-danger"></span>
    </div>
  </div>
  <div class="row m-1 g-3">
    <div class="col-sm-6 offset-sm-3">
      <button type="submit" class="btn btn-primary">ログイン</button>
    </div>
  </div>
  <div class="row m-1 g-3">
    <div class="col-sm-6 offset-sm-3">
      <a asp-controller="Home" asp-action="Index">認証が必要な画面へ直接リンク</a>
    </div>
  </div>
</form>

@section Scripts {
  @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
}

Izveidojiet atteikšanās saiti (/Views/Shared/_Layout.cshtml)

Sākuma ekrānā mēs neveiksim nekādas izmaiņas, bet navigācijas joslā ievietosim atteikšanās saiti. Testēšanai ievietojiet arī saiti, kas novirza jūs uz pieteikšanās ekrānu, neizrakstoties.

<!-- 中略 -->
<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">ログアウト</a>
    </li>
    <li class="nav-item">
      <a class="nav-link text-dark" asp-controller="Account" asp-action="Login">ログアウトせずログインへ</a>
    </li>
    <!-- ここまで追加 -->
  </ul>
</div>
<!-- 中略 -->

Tas ir tas MVC kodam.

Darbības apstiprinājums

Tādējādi tiek pabeigta minimālā nepieciešamā sīkfailu autentifikācijas ieviešana. Mēģiniet to palaist un redzēt, kā tas darbojas. Uzvedībai vajadzētu mainīties atkarībā no tā, vai esat pieteicies vai nē. Kā vienkāršu piemēru jūs varat redzēt šādu uzvedību.

Darbības darbības rezultāts
Dodieties mājās, nepiesakoties Novirzīšana uz pieteikšanās ekrānu
Pieteikšanās Doties uz sākuma ekrānu
Izrakstieties no mājām un dodieties mājās, nepiesakoties Novirzīšana uz pieteikšanās ekrānu
Dodieties mājās, neizejot no mājām un nepiesakoties Doties uz sākuma ekrānu