Tạo cơ chế chuyển hướng nếu bạn không đăng nhập bằng xác thực cookie (ASP.NET Core 3.0)

Trang Cập Nhật :
Ngày tạo trang :

Môi trường

Visual Studio-giường
  • Cộng đồng Visual Studio 2019
ASP.NET lõi
3,0 hoặc mới hơn

Xác thực cookie có thể được sử dụng trong .NET Core 2,2 hoặc cũ hơn, nhưng các mẹo của chúng tôi bao gồm mã riêng cho .NET Core 3,0 và mới hơn.

Lúc đầu

ASP.NET Core sử dụng xác thực cookie như một cơ chế xác thực đăng nhập. Bạn có thể nghĩ rằng xác thực cookie như một cái gì đó tương tự như xác thực các hình thức truyền thống.

Một cách khác để xác thực ASP.NET Core là ASP.NET Core Identity. Ngoài việc xác thực bằng cách sử dụng các hình thức, API xác thực, Dịch vụ đăng nhập bên ngoài, quản lý mật khẩu và thiết lập lại, vv. Bạn có thể sử dụng rất nhiều chức năng. Tuy nhiên, từ quan điểm của chỉ cần thực hiện một màn hình đăng nhập đơn giản thời gian này, nó trở thành một cơ chế của một chút xác thực phóng đại Tôi không sử dụng nó vào thời gian này.

Trong các mẹo để xác thực cookie, bạn không thể hiển thị bất cứ thứ gì khác ngoài màn hình đăng nhập trừ khi bạn đăng nhập. Nếu bạn cố gắng để đi đến một màn hình khác nhau, bạn sẽ được chuyển hướng đến màn hình đăng nhập. Bạn cũng có thể xem các màn hình khác bằng cách đăng nhập.

Khi bạn nhập tên người dùng và mật khẩu của bạn trên màn hình đăng nhập, bạn có thể đăng nhập. Xác thực của chính người dùng được thực hiện ở vị trí tạm thời. Kể từ khi thực hiện chính xác thực cookie là lần cuối cùng, quá trình phán quyết, chẳng hạn như việc mật khẩu là chính xác, không phải là điều cần thiết.

Mẹo này liệt kê các chương trình spartly. Tải về chương trình hoàn chỉnh cho mã hoàn chỉnh.

Tạo dự án

Bắt đầu Visual Studio và tạo một dự án mới.

image

chọn ASP.net ứng dụng web lõi.

image

Chỉ định tên dự án và vị trí dự án.

image

Thời gian này, chúng tôi sẽ sử dụng các dự án MVC, nhưng hầu hết các mẫu khác có thể được thay thế.

Để xác thực, chọn không xác thực. Nếu bạn chọn xác thực khác, bạn sẽ sử dụng ASP.NET Core Identity.

image

Sau khi bạn tạo một dự án và gỡ lỗi, màn hình trong hình dưới đây xuất hiện. Chúng tôi sẽ tạo một chương trình dựa trên màn hình này.

image

Sửa Startup.cs

Startup.cs thêm các định nghĩa cần thiết cho việc xác thực cookie. Không tên sử dụng:

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;

Bạn có thể kích hoạt cookie xác thực bằng cách chạy các phương pháp AddAuthentication và AddCookie. Chỉ định Cookieauthenticationvalues. AuthenticationScheme nếu bạn không cần thay đổi tên chương trình đặc biệt.

Tùy chọn phương pháp adduỷ quyền. Nếu bạn chỉ định RequireAuthenticatedUser trong FallbackPolicy, Tất cả các bộ điều khiển có thể có chính sách yêu cầu xác thực được áp dụng cho hành động. Nó cũng hữu ích trong ý nghĩa rằng mã giảm và lỗi mô tả được ngăn chặn nếu xác thực được yêu cầu khác với màn hình đăng nhập. Chỉ màn hình đăng nhập sẽ ghi mã không yêu cầu xác thực riêng lẻ.

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

Thêm xác thực vào ứng dụng của bạn. Thêm UseAuthentication (). Vị trí mô tả dựa trên tài liệu MSDN. Nơi trước Useuỷ quyền (). Mọi thứ khác vẫn là một mẫu.

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

Tạo một AccountController

Tạo bộ điều khiển và hành động bạn cần để tạo màn hình đăng nhập. Tên bộ điều khiển được tạo ra như AccountController. Bởi vì theo mặc định, tên bộ điều khiển và tên hành động của màn hình đăng nhập được xác định là "~/Account/Login". Nếu bạn muốn thay đổi đường dẫn này, bạn có thể thay đổi nó với các tùy chọn của phương pháp AddCookie trong Startup.cs. Chúng ta sẽ đi qua với các thiết lập mặc định.

image

Bước đầu tiên là tạo bên điều khiển. Bằng cách cấp thuộc tính Allowanonymous , tất cả các hành động trong nó có thể được thực hiện ngay cả khi họ không được xác nhận. Điều này chỉ cho phép truy cập màn hình đăng nhập mà không cần xác thực.

Thuộc tính Allowanonymous độc lập với cookie xác thực như là một vị trí khác với màn hình đăng nhập. Nó cũng có thể được sử dụng trên bộ điều khiển chỉ 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
  {
  }
}

Xác định người dùng và mật khẩu có thể được đăng nhập. Ban đầu tôi lưu nó vào một cơ sở dữ liệu, nhưng lần này bản án người dùng không phải là trọng tâm chính Tôi làm cho nó bằng một tập tạm thời.

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

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

Đây là một hành động để hiển thị màn hình đăng nhập. Trả lại xem vì nó là bởi vì nó chỉ hiển thị.

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

Quá trình xác thực sau khi nhấn vào nút đăng nhập. Nếu tên người dùng và mật khẩu phù hợp, nó có thể được xác thực.

Mã sau đây xác định yêu cầu bồi thường, nhận dạng và Pricinpal là mã tối thiểu cần thiết để xác thực. Gọi phương pháp HttpContext. SignInAsync tạo một cookie và authenticates nó.

Nếu yêu cầu bồi thường bổ sung hoặc cookie hết hạn, thêm thông số.

Sau khi đăng nhập, chúng tôi đã chuyển hướng đến ~/Home/Index, yêu cầu xác thực.

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

Nhập quá trình đăng xuất. Bạn có thể xoá cookie và trả lại trạng thái chưa đăng nhập bằng cách gọi phương pháp HttpContext. SignOutAsync.

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

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

Tạo chế độ xem (biểu mẫu đăng nhập) (/lượt xem/Account/login.cshtml)

Vì chúng tôi không đưa nó vào tài khoản, thêm một lĩnh vực để nhập tên người dùng và mật khẩu của bạn, như được hiển thị trong hình dưới đây, và nơi một nút để đăng nhập. Bạn cũng nên để một liên kết để truy cập vào trang chủ/index mà không cần đăng nhập cho mục đích thử nghiệm.

Bởi vì nó là rắc rối để nhập tên người dùng và mật khẩu, giá trị ban đầu được thiết lập.

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>

Tạo một liên kết đăng xuất (/xemtháng/Shared/_Layout. cshtml)

Màn hình chính sẽ không thay đổi bất cứ điều gì, nhưng bạn sẽ có một liên kết đăng xuất trong thanh điều hướng. Ngoài ra, tôi cũng sẽ đặt một liên kết chuyển tiếp đến màn hình đăng nhập mà không cần đăng xuất cho mục đích thử nghiệm.

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

Kiểm tra hoạt động

Bây giờ bạn đã hoàn tất việc thực hiện tối thiểu cần thiết để xác thực cookie. Cố gắng làm điều đó và xem làm thế nào nó hoạt động. Nó sẽ thay đổi hành vi tùy thuộc vào việc bạn đang đăng nhập hay không. Như một ví dụ đơn giản, tôi nghĩ rằng bạn có thể xem hành vi sau đây.

Hoạt động kết quả hoạt động
Về nhà mà không cần đăng nhập Chuyển hướng đến màn hình đăng nhập
Đăng nhập Đi tới màn hình chính
Đăng xuất khỏi nhà và về nhà mà không cần đăng nhập Chuyển hướng đến màn hình đăng nhập
Không đăng xuất khỏi nhà và về nhà mà không cần đăng nhập Đi tới màn hình chính