Δημιουργία μηχανισμού ανακατεύθυνσης εάν δεν συνδεθείτε χρησιμοποιώντας έλεγχο ταυτότητας cookie (ASP.NET Core 3.0)

Σελίδα ενημέρωση :
Ημερομηνία δημιουργίας σελίδας :

Περιβάλλον

Οπτικό Στούντιο
  • Κοινότητα Οπτικού Στούντιο 2019
ASP.NET πυρήνας
3.0 ή νεότερη έκδοση

Ο έλεγχος ταυτότητας cookie μπορεί να χρησιμοποιηθεί στο .NET Core 2.2 ή παλαιότερη έκδοση, αλλά οι συμβουλές μας περιλαμβάνουν κώδικα ειδικά για το .NET Core 3.0 και νεότερες εκδόσεις.

Στην αρχή

ASP.NET Core χρησιμοποιεί έλεγχο ταυτότητας cookie ως μηχανισμό ελέγχου ταυτότητας σύνδεσης. Μπορείτε να θεωρήσετε τον έλεγχο ταυτότητας cookie ως κάτι παρόμοιο με τον έλεγχο ταυτότητας παραδοσιακών φορμών.

Ένας άλλος τρόπος για τον έλεγχο ταυτότητας ASP.NET Πυρήνας είναι ASP.NET Core Ταυτότητα. Εκτός από τον έλεγχο ταυτότητας χρησιμοποιώντας φόρμες, έλεγχο ταυτότητας API, εξωτερικές υπηρεσίες σύνδεσης, διαχείριση κωδικών πρόσβασης και επαναφορά, κλπ. Μπορείτε να χρησιμοποιήσετε πολλές λειτουργίες. Ωστόσο, από την άποψη του να κάνει ακριβώς μια απλή οθόνη σύνδεσης αυτή τη φορά, γίνεται ένας μηχανισμός μιας μικρής υπερβολικής ελέγχου ταυτότητας Δεν το χρησιμοποιώ αυτή τη στιγμή.

Στις συμβουλές για τον έλεγχο ταυτότητας cookie, δεν μπορείτε να εμφανίσετε τίποτα άλλο εκτός από την οθόνη σύνδεσης, εκτός αν συνδεθείτε. Εάν προσπαθήσετε να μεταβείτε σε διαφορετική οθόνη, θα ανακατευθυνθείτε στην οθόνη σύνδεσης. Μπορείτε επίσης να δείτε άλλες οθόνες πραγματοποιώντας σύνδεση.

Μόλις εισαγάγετε το όνομα χρήστη και τον κωδικό πρόσβασής σας στην οθόνη σύνδεσης, μπορείτε να συνδεθείτε. Ο έλεγχος ταυτότητας του ίδιου του χρήστη υλοποιείται σε προσωρινή θέση. Δεδομένου ότι η κύρια εφαρμογή της εξακρίβωσης της γνησιότητας των cookies είναι μέχρι την τελευταία φορά, η διαδικασία της κρίσης, όπως το αν ο κωδικός πρόσβασης είναι σωστός, δεν είναι απαραίτητη.

Αυτό Συμβουλές απαριθμεί το πρόγραμμα εν μέρει. Κατεβάστε το πλήρες πρόγραμμα για τον πλήρη κώδικα.

Δημιουργία έργου

Ξεκινήστε το Visual Studio και δημιουργήστε ένα νέο έργο.

image

επιλέξτε ASP.NET βασική εφαρμογή Web.

image

Καθορίστε οποιοδήποτε όνομα έργου και θέση έργου.

image

Αυτή τη φορά, θα χρησιμοποιήσουμε έργα mvc, αλλά τα περισσότερα από τα άλλα πρότυπα μπορούν να αντικατασταθούν.

Για έλεγχο ταυτότητας, επιλέξτε Χωρίς έλεγχο ταυτότητας. Εάν επιλέξετε άλλο έλεγχο ταυτότητας, θα χρησιμοποιήσετε ASP.NET Βασική ταυτότητα.

image

Αφού δημιουργήσετε ένα έργο και το αποσφαλμάτωσετε, εμφανίζεται η οθόνη στην παρακάτω εικόνα. Θα δημιουργήσουμε ένα πρόγραμμα βασισμένο σε αυτήν την οθόνη.

image

Επεξεργασία Startup.cs

Startup.cs προσθέσετε τους ορισμούς που απαιτούνται για τον έλεγχο ταυτότητας cookie. Οι χώροι ονομάτων χρησιμοποιούν:

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;

Μπορείτε να ενεργοποιήσετε τον έλεγχο ταυτότητας cookie εκτελώντας τις μεθόδους AddAuthentication και AddCookie. Καθορίστε τις προεπιλογές ελέγχου ταυτότητας cookie.AuthenticationScheme εάν δεν χρειάζεται να αλλάξετε το όνομα του συνδυασμού ειδικότερα.

Οι επιλογές της μεθόδου addauthorization. Εάν καθορίσετε απαίτηση πιστοποιημένου χρήστη στην εφεδρική πολιτική, Όλοι οι ελεγκτές μπορούν να εφαρμόσουν μια πολιτική που απαιτείται από τον έλεγχο ταυτότητας στην ενέργεια. Είναι επίσης χρήσιμο με την έννοια ότι ο κώδικας μειώνεται και το σφάλμα περιγραφής εμποδίζεται εάν απαιτείται έλεγχος ταυτότητας εκτός από την οθόνη σύνδεσης. Μόνο η οθόνη σύνδεσης θα γράψει τον κώδικα που δεν απαιτεί έλεγχο ταυτότητας ξεχωριστά.

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

Προσθέστε έλεγχο ταυτότητας στην εφαρμογή σας. Προσθήκη ελέγχου ταυτότητας χρήσης χρήσης(). Η θέση περιγραφής βασίζεται στην τεκμηρίωση του MSDN. Τοποθετήστε μπροστά από useauthorization(). Όλα τα άλλα παραμένουν ένα πρότυπο.

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

Δημιουργία ελεγκτή λογαριασμού

Δημιουργήστε τους ελεγκτές και τις ενέργειες που χρειάζεστε για να δημιουργήσετε μια οθόνη σύνδεσης. Το όνομα του ελεγκτή δημιουργείται ως Ελεγκτής λογαριασμού. Αυτό συμβαίνει επειδή από προεπιλογή, το όνομα του ελεγκτή και το όνομα ενέργειας της οθόνης σύνδεσης καθορίζονται ως "~/Λογαριασμός/Σύνδεση". Εάν θέλετε να αλλάξετε αυτήν τη διαδρομή, μπορείτε να την αλλάξετε με τις επιλογές της μεθόδου AddCookie σε Startup.cs. Θα προχωρήσουμε με τις προεπιλεγμένες ρυθμίσεις.

image

Το πρώτο βήμα είναι να δημιουργήσετε την πλευρά του χειριστηρίου. Με την εκχώρηση του χαρακτηριστικού AllowAnonymous, όλες οι ενέργειες σε αυτό μπορούν να εκτελεστούν ακόμα και αν δεν έχουν γίνει έλεγχος ταυτότητας. Αυτό επιτρέπει μόνο την πρόσβαση στην οθόνη σύνδεσης χωρίς έλεγχο ταυτότητας.

Το χαρακτηριστικό AllowAnonymous είναι ανεξάρτητο από τον έλεγχο ταυτότητας cookie ως θέση εκτός από την οθόνη σύνδεσης. Μπορεί επίσης να χρησιμοποιηθεί σε ελεγκτές μόνο για 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
  {
  }
}

Ορίστε τους χρήστες και τους κωδικούς πρόσβασης που μπορούν να είναι συνδεδεμένοι. Αρχικά το σώζω σε μια βάση δεδομένων, αλλά αυτή τη φορά η κρίση χρηστών δεν είναι η κύρια εστίαση Τα καταφέρνω με προσωρινό σετ.

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

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

Αυτή είναι μια ενέργεια για την εμφάνιση της οθόνης σύνδεσης. Επιστρέψτε την προβολή όπως είναι, επειδή εμφανίζεται μόνο.

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

διαδικασία ελέγχου ταυτότητας αφού πατήσετε το κουμπί σύνδεσης. Εάν το όνομα χρήστη και ο κωδικός πρόσβασης ταιριάζουν, μπορεί να γίνει έλεγχος ταυτότητας.

Ο ακόλουθος κώδικας ορίζει την αξίωση, την ταυτότητα και το Pricinpal ως τον ελάχιστο κωδικό που απαιτείται για τον έλεγχο ταυτότητας. Η κλήση της μεθόδου HttpContext.SignInAsync δημιουργεί ένα cookie και το ελέγχει.

Εάν απαιτούνται πρόσθετες αξιώσεις ή λήξουν τα cookies, προσθέστε παραμέτρους.

Μετά τη σύνδεση, έχουμε ανακατευθυνθεί σε ~/Αρχική/Ευρετήριο, το οποίο απαιτεί έλεγχο ταυτότητας.

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

Εισαγάγετε τη διαδικασία αποσύνδεσης. Μπορείτε να διαγράψετε ένα cookie και να το επιστρέψετε σε κατάσταση χωρίς καταγραφή, καλώντας τη μέθοδο HttpContext.SignOutAsync.

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

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

Δημιουργία προβολής (φόρμα σύνδεσης) (/Προβολές/Λογαριασμός/Login.cshtml)

Εφόσον δεν το λάβουμε υπόψη, προσθέστε ένα πεδίο για να εισαγάγετε το όνομα χρήστη και τον κωδικό πρόσβασής σας, όπως φαίνεται στην παρακάτω εικόνα, και τοποθετήστε ένα κουμπί για να συνδεθείτε. Θα πρέπει επίσης να τοποθετήσετε μια σύνδεση για να αποκτήσετε πρόσβαση στην Αρχική Σελίδα/Ευρετήριο χωρίς να συνδεθείτε για σκοπούς δοκιμής.

Επειδή είναι ενοχλητικό να εισάγετε το όνομα χρήστη και τον κωδικό πρόσβασης, η αρχική τιμή έχει οριστεί.

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>

Δημιουργία σύνδεσης αποσύνδεσης (/Προβολές/Κοινή χρήση/_Layout.cshtml)

Η αρχική οθόνη δεν θα αλλάξει τίποτα, αλλά θα έχετε μια σύνδεση αποσύνδεσης στη γραμμή περιήγησης. επιπλέον, εγώ' επίσηs βάζω έναs σύνδεσμος ότι μεταβάσεις στο login οθόνη χωρίs logging έξω για δοκιμάζω σκοπός.

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

Έλεγχος λειτουργίας

Έχετε ολοκληρώσει την ελάχιστη εφαρμογή που απαιτείται για τον έλεγχο ταυτότητας cookie. Προσπαθήστε να το κάνετε και να δούμε πώς λειτουργεί. Θα πρέπει να αλλάξει τη συμπεριφορά ανάλογα με το αν είστε συνδεδεμένοι ή όχι. Ως απλό παράδειγμα, νομίζω ότι μπορείτε να δείτε την ακόλουθη συμπεριφορά.

Λειτουργία Αποτελέσματα Λειτουργίας
Επιστροφή στο σπίτι χωρίς να συνδεθείτε Ανακατεύθυνση στην οθόνη σύνδεσης
Σύνδεση Μετάβαση στην αρχική οθόνη
Αποσυνδεθείτε από το σπίτι και πηγαίνετε σπίτι χωρίς να συνδεθείτε Ανακατεύθυνση στην οθόνη σύνδεσης
Μην αποσυνδέεστε από το σπίτι και πηγαίνετε σπίτι χωρίς να συνδεθείτε Μετάβαση στην αρχική οθόνη