Izveidojiet mehānismu, kas tiks novirzīts, ja nepieteiksieties, izmantojot sīkfailu autentifikāciju (ASP.NET Core 3.0)

Lapa atjaunota :
Lapas izveides datums :

Vides

Visual Studio
  • Visual Studio Kopienas 2019
ASP.NET Core
3,0 vai jaunāka versija

Sīkfailu autentifikāciju var izmantot .NET Core 2,2 vai vecākā versijā, bet mūsu padomi ietver kodu, kas īpaši paredzēts .NET Core 3,0 un jaunākām versijām.

Sākumā

ASP.NET Core izmanto sīkfailu autentifikāciju kā pieteikšanās autentifikācijas mehānismu. Sīkfailu autentifikāciju var uzskatīt par kaut ko līdzīgu tradicionālajām veidlapu autentificēšanai.

Vēl viens veids, kā autentificēt ASP.NET Core ir ASP.NET Core Identity. Papildus autentifikāciju, izmantojot veidlapas, API autentifikāciju, ārējo login pakalpojumus, paroļu pārvaldību un reset, uc Jūs varat izmantot daudzas funkcijas. Tomēr no viedokļa tikai veicot vienkāršu Login Screen šajā laikā, tā kļūst mehānisms nedaudz pārspīlētas autentifikācijas Man nav to izmantot šajā laikā.

Sīkfailu autentifikācijas padomi nevar parādīt neko citu kā pieteikšanās ekrānu, ja vien jūs piesakāties. Ja jūs mēģināt iet uz citu ekrānu, jums tiks novirzīts uz pieteikšanās ekrānu. Varat arī redzēt citus ekrānus, piesakoties sistēmā.

Kad jūs ievadāt savu lietotāja vārdu un paroli pieteikšanās ekrānā, jūs varat ieiet. Lietotāja autentifikācija tiek ieviesta pagaidu stāvoklī. Tā kā galvenais sīkdatņu autentifikācijas implementācija ir pēdējā šajā laikā, sprieduma process, piemēram, vai parole ir pareiza, nav būtisks.

Šie padomi uzskaita programmu spartly. Lejupielādēt pilnu programmu pilnīgu kodu.

Izveidot projektu

Startējiet programmu Visual Studio un izveidojiet jaunu projektu.

image

atlasiet ASP.NET Core Web Application.

image

Norādiet projekta nosaukumu un projekta atrašanās vietu.

image

Šoreiz mēs izmantosim MVC projektiem, bet lielākā daļa no citām veidnēm var aizstāt.

Autentifikācijai, atlasiet bez autentifikācijas. Ja izvēlēsities citu autentifikāciju, tiks izmantota ASP.NET pamata identitāte.

image

Pēc tam, kad izveidojat projektu un atkļūdot, ekrāna attēlā parādās. Mēs izveidosim programmu, kas balstīta uz šo ekrānu.

image

Rediģēt Startup.cs

Startup.cs pievienot sīkfailu autentifikācijai nepieciešamās definīcijas. Nosaukumvietas izmantot:

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;

Varat iespējot sīkfailu autentifikāciju, palaižot AddAuthentication un AddCookie metodes. Norādiet CookieAuthenticationDefaults. AuthenticationScheme, ja shēmas nosaukums nav jāmaina īpaši.

Addauthorization metodes opcijas. Ja norādāt RequireAuthenticatedUser ar FallbackPolicy, Visiem kontrolleriem var būt darbībai nepieciešama autentifikācija. Tas ir arī noderīga tādā nozīmē, ka kods ir samazināts un apraksts kļūda ir novērsta, ja autentifikācija ir nepieciešama, izņemot pieteikšanās ekrānu. Tikai pieteikšanās ekrānā tiks uzrakstītu kodu, kas neprasa autentifikāciju atsevišķi.

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

Pievienojiet lietojumprogrammai autentifikāciju. Pievienot UseAuthentication (). Apraksts atrašanās vieta ir balstīts uz MSDN dokumentāciju. Vietā pirms lietošanas atļaujas (). Viss pārējais paliek veidne.

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 izveide

Izveidot kontrolieriem un darbības, jums ir nepieciešams, lai izveidotu pieteikšanās ekrānu. Kontrollera nosaukums tiek izveidots kā AccountController. Tas ir tāpēc, ka pēc noklusējuma, kontrolieris nosaukumu un darbības nosaukumu, pieteikšanās ekrāna ir apņēmusies "~/account/login". Ja vēlaties mainīt šo ceļu, varat to mainīt ar AddCookie metodi Startup.cs. Mēs iet cauri ar noklusējuma iestatījumiem.

image

Pirmais solis ir izveidot kontrolieris pusē. Piešķirot Allowanonymous atribūtu, visas darbības tajā var veikt pat tad, ja tie nav autentificēti. Tas ļauj piekļūt bez autentifikācijas tikai pieteikšanās ekrānu.

Allowanonymous atribūts nav atkarīgs no sīkfailu autentifikācijas kā atrašanās vietu, kas nav pieteikšanās ekrānu. To var izmantot arī tikai API kontrolleriem.

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

Definējiet lietotājus un paroles, kuras var būt pieteikušās. Sākotnēji es to saglabāt datu bāzē, bet šoreiz lietotājs spriedums nav galvenā uzmanība Es padara to ar pagaidu komplektu.

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

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

Šī ir darbība, lai parādītu pieteikšanās ekrānu. Atgriezt skatu tā, kā tas ir, jo tas tiek parādīts tikai.

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

Autentifikācijas procesu pēc nospiežot pieteikšanās pogu. Ja lietotājvārds un parole sakrīt, to var autentificēt.

Šis kods definē prasību, identitāti un Pricinpal kā minimālo kodu, kas nepieciešams autentifikācijai. Zvanot HttpContext. SignInAsync metode ģenerē sīkfailu un autentificē to.

Ja ir nepieciešamas papildu prasības vai sīkfailu derīguma termiņš, pievienojiet parametrus.

Pēc piesakoties, mums ir novirzīts uz ~/Home/Index, kas prasa autentifikāciju.

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

Ievadiet atteikties procesu. Varat dzēst sīkfailu un atgriezt to nereģistrētās stāvoklī, izsaucot metodi HttpContext. SignOutAsync.

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

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

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

Tā kā mēs to neņemtu vērā, pievienojiet lauku, lai ievadītu savu lietotājvārdu un paroli, kā parādīts attēlā zemāk, un novietojiet pogu, lai pieteiktos. Jums vajadzētu arī vieta saiti uz piekļuvi Home/index bez piesakoties testēšanas nolūkos.

Jo tas ir apgrūtinoši ievadīt lietotāja vārdu un paroli, sākotnējā vērtība ir iestatīta.

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>

Izveidojiet saiti atteikties (/Views/Shared/_Layout. cshtml)

Sākuma ekrāns neko nemainīs, bet navigācijas joslā būs saite atteikties. Turklāt, es ņemšu arī nodot saiti, kas pāreju uz pieteikšanās ekrānu bez atteikšanās testēšanas nolūkos.

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

Pārbaudiet darbību

Tagad ir pabeigta sīkfailu autentifikācijai nepieciešamā minimālā ieviešana. Centieties to darīt un redzēt, kā tā darbojas. Tas būtu jāmaina uzvedība atkarībā no tā, vai esat pieteicies vai ne. Kā vienkāršs piemērs, es domāju, ka jūs varat redzēt šādu uzvedību.

Operation darbības rezultāti
Doties mājās, neieejot Novirzīt uz pieteikšanās ekrānu
Pieteikšanās Doties uz sākuma ekrānu
Atsakieties no mājām un dodieties mājās, neieejot Novirzīt uz pieteikšanās ekrānu
Nelietojiet atsakieties no mājām un doties mājās bez reģistrēšanas Doties uz sākuma ekrānu