Membuat mekanisme untuk dialihkan jika Anda tidak masuk menggunakan autentikasi cookie (ASP.NET Core 3.0)

Halaman Diperbarui :
Tanggal pembuatan halaman :

Lingkungan

Studio visual
  • Visual Studio komunitas 2019
ASP.NET inti
3,0 atau yang lebih baru

Cookie otentikasi dapat digunakan dalam .NET inti 2,2 atau yang lebih lawas, tetapi tips kami mencakup kode khusus untuk .NET inti 3,0 dan yang lebih baru.

Pada mulanya

ASP.NET Core menggunakan otentikasi cookie sebagai mekanisme otentikasi login. Anda dapat memikirkan otentikasi cookie sebagai sesuatu yang mirip dengan otentikasi bentuk tradisional.

Cara lain untuk mengotentikasi ASP.NET Core adalah ASP.NET Core Identity. Selain otentikasi menggunakan formulir, api otentikasi, Layanan login eksternal, manajemen password dan reset, dll. Anda dapat menggunakan banyak fungsi. Namun, dari sudut pandang hanya membuat layar login sederhana kali ini, itu menjadi mekanisme otentikasi sedikit berlebihan Saya tidak menggunakannya saat ini.

Dalam tips untuk otentikasi cookie, Anda tidak dapat menampilkan apa pun selain layar login kecuali Anda login. Jika Anda mencoba untuk pergi ke layar yang berbeda, Anda akan diarahkan ke layar login. Anda juga dapat melihat layar lain dengan masuk.

Setelah memasukkan nama pengguna dan kata sandi pada layar masuk, Anda dapat masuk. Otentikasi pengguna itu sendiri diterapkan dalam posisi sementara. Karena implementasi utama dari otentikasi cookie adalah untuk terakhir kali ini, proses penilaian, seperti apakah password benar, tidak penting.

Tips ini daftar program spartly. Download program lengkap untuk kode lengkap.

Buat proyek

Mulai Visual Studio dan membuat proyek baru.

image

pilih aplikasi web inti ASP.net.

image

Tentukan nama proyek dan lokasi proyek.

image

Kali ini, kita akan menggunakan proyek MVC, namun sebagian besar template lainnya dapat digantikan.

Untuk autentikasi, pilih tidak ada autentikasi. Jika Anda memilih otentikasi lain, Anda akan menggunakan ASP.NET Core Identity.

image

Setelah Anda membuat sebuah proyek dan debug itu, layar pada gambar di bawah ini muncul. Kami akan membuat program berdasarkan layar ini.

image

Edit Startup.cs

Startup.cs menambahkan definisi yang diperlukan untuk otentikasi cookie. Namespaces menggunakan:

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;

Anda dapat mengaktifkan otentikasi cookie dengan menjalankan metode AddAuthentication dan AddCookie. Tentukan CookieAuthenticationDefaults. AuthenticationScheme jika Anda tidak perlu mengubah nama skema khususnya.

Opsi metode addauthorization. Jika Anda menetapkan menuntut Authenticateduser di FallbackPolicy, Semua pengontrol dapat memiliki kebijakan otentikasi yang diperlukan diterapkan pada tindakan. Hal ini juga berguna dalam arti bahwa kode berkurang dan kesalahan Deskripsi dicegah jika otentikasi diperlukan selain layar login. Hanya layar login akan menulis kode yang tidak memerlukan otentikasi secara individual.

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

Tambahkan autentikasi ke aplikasi Anda. Tambahkan UseAuthentication (). Deskripsi lokasi didasarkan pada dokumentasi MSDN. Tempatkan di depan UseAuthorization (). Segala sesuatu yang lain tetap menjadi template.

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

Membuat AccountController

Buat controller dan tindakan yang Anda butuhkan untuk membuat layar login. Nama kontroler dibuat sebagai AccountController. Hal ini karena secara default, nama controller dan nama tindakan layar login bertekad untuk menjadi "~/Account/Login". Jika Anda ingin mengubah jalur ini, Anda dapat mengubahnya dengan opsi metode AddCookie di Startup.cs. Kita akan pergi melalui dengan pengaturan default.

image

Langkah pertama adalah untuk membuat sisi controller. Dengan memberikan atribut Allowanonymous , semua tindakan di dalamnya dapat dilakukan bahkan jika mereka tidak diautentikasi. Hal ini hanya memungkinkan layar login untuk diakses tanpa otentikasi.

Atribut Allowanonymous adalah independen dari otentikasi cookie sebagai lokasi selain layar login. Ini juga dapat digunakan pada pengontrol api saja.

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

Tentukan pengguna dan sandi yang dapat login. Awalnya saya menyimpannya ke database, tapi kali ini penilaian pengguna bukan fokus utama Aku membuatnya dengan satu set sementara.

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

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

Ini adalah tindakan untuk menampilkan layar login. Kembalikan tampilan seperti itu karena hanya menampilkan.

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

Proses autentikasi setelah menekan tombol login. Jika nama pengguna dan sandi cocok, dapat dikonfirmasi.

Kode berikut mendefinisikan klaim, identitas, dan Pricinpal sebagai kode minimum yang diperlukan untuk otentikasi. Memanggil metode HttpContext. SignInAsync menghasilkan cookie dan mengotentikasi itu.

Jika klaim tambahan diperlukan atau cookie kedaluwarsa, tambahkan parameter.

Setelah masuk, kita telah diarahkan ke ~/Home/Index, yang memerlukan otentikasi.

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

Masukkan proses logout. Anda dapat menghapus kuki dan mengembalikannya ke keadaan yang tidak tercatat dengan memanggil metode HttpContext. SignOutAsync.

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

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

Buat tampilan (form login) (/Views/Account/Login.cshtml)

Karena kita tidak memperhitungkan, tambahkan Field untuk memasukkan username dan password Anda, seperti yang ditunjukkan pada gambar di bawah, dan tempatkan tombol untuk masuk. Anda juga harus menempatkan link untuk mengakses Home/index tanpa login untuk tujuan pengujian.

Karena merepotkan untuk memasukkan nama pengguna dan kata sandi, nilai awal diatur.

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>

Membuat link logout (/Views/Shared/_Layout. cshtml)

Layar awal tidak akan mengubah apa pun, tetapi Anda akan memiliki tautan logout di bilah navigasi. Selain itu, saya juga akan menaruh link yang transisi ke layar login tanpa log out untuk tujuan pengujian.

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

Periksa operasi

Anda sekarang telah menyelesaikan penerapan minimum yang diperlukan untuk otentikasi cookie. Cobalah untuk melakukannya dan melihat cara kerjanya. Ini harus mengubah perilaku tergantung pada apakah Anda login atau tidak. Sebagai contoh sederhana, saya pikir Anda dapat melihat perilaku berikut.

Operasi hasil operasi
Pulang tanpa masuk Redirect ke layar login
Login Pergi ke Home Screen
Keluar rumah dan pulang tanpa login Redirect ke layar login
Jangan keluar dari rumah dan pulang tanpa harus masuk Pergi ke Home Screen