कुकी प्रमाणीकरण का उपयोग करके एक लॉगिन तंत्र बनाएं, और यदि आप प्रमाणित नहीं हैं तो पुनर्निर्देशित करने के लिए एक तंत्र बनाएं

पेज अद्यतन :
पेज निर्माण की तारीख :

ऑपरेटिंग वातावरण

विजुअल स्टूडियो
  • विजुअल स्टूडियो कम्युनिटी 2022
ASP.NET कोर (MVC, रेजर पेज)
6.0

पहले

इस बार, ASP.NET कोर लॉगिन प्रमाणीकरण तंत्र के रूप में कुकी प्रमाणीकरण का उपयोग करेगा। आप कुकी प्रमाणीकरण को पारंपरिक रूपों के प्रमाणीकरण के समान मान सकते हैं।

कोर ASP.NET लिए एक अन्य प्रमाणीकरण तंत्र ASP.NET कोर पहचान है। प्रपत्रों का उपयोग करके प्रमाणीकरण के अलावा, यह आपको एपीआई के साथ प्रमाणित करने, बाहरी लॉगिन सेवाओं का उपयोग करने, पासवर्ड प्रबंधित करने और रीसेट करने आदि की अनुमति देता है। आप बहुत सारी सुविधाओं का उपयोग कर सकते हैं। हालाँकि, इस बार केवल एक साधारण लॉगिन स्क्रीन बनाने के दृष्टिकोण से, यह कुछ हद तक अतिरंजित प्रमाणीकरण तंत्र होगा। इस बार हम इसका इस्तेमाल नहीं करेंगे।

इस बार पेश की गई कुकी प्रमाणीकरण युक्तियों में, आप लॉगिन स्क्रीन के अलावा कुछ भी प्रदर्शित नहीं कर सकते जब तक कि आप लॉग इन नहीं करते। यदि आप किसी अन्य स्क्रीन पर नेविगेट करने का प्रयास करते हैं, तो आपको लॉगिन स्क्रीन पर पुनः निर्देशित किया जाएगा। यदि आप लॉग इन करते हैं, तो आप अन्य स्क्रीन देख सकते हैं।

फिलहाल, आप लॉगिन स्क्रीन पर अपना यूजर नेम और पासवर्ड डालकर लॉग इन कर सकते हैं। उपयोगकर्ता प्रमाणीकरण स्वयं एक अस्थायी स्थान के रूप में लागू किया गया है। इस मामले में, मुख्य ध्यान कुकी प्रमाणीकरण के कार्यान्वयन पर है, इसलिए निर्धारण प्रक्रिया का सार जैसे कि पासवर्ड सही है या नहीं, सार नहीं है।

यह टिप कार्यक्रम के केवल एक हिस्से का वर्णन करती है। पूर्ण कोड के लिए, पूरा प्रोग्राम डाउनलोड करें। इसमें MVC और Razor Pages फ्रेमवर्क दोनों शामिल हैं।

एक परियोजना बनाएँ

Visual Studio प्रारंभ करें और कोई नया प्रोजेक्ट बनाएँ।

रेजर पेजों के लिए, ASP.NET कोर वेब ऐप चुनें, या एमवीसी के लिए, ASP.NET कोर वेब ऐप (मॉडल-व्यू-कंट्रोलर) चुनें।

अपनी पसंद का प्रोजेक्ट नाम और प्रोजेक्ट के लिए स्थान निर्दिष्ट करें।

प्रमाणीकरण प्रकार के लिए, "कोई नहीं" चुनें। यदि आप अन्य प्रमाणीकरण चुनते हैं, तो आप ASP.NET कोर पहचान का उपयोग करेंगे। जब आप सेटिंग्स के साथ कर लें, तो "बनाएं" बटन पर क्लिक करें।

प्रोजेक्ट बनाने के बाद, डिबगिंग निष्पादित होने पर नीचे दिखाई गई स्क्रीन प्रदर्शित होगी। हम इस स्क्रीन पर आधारित एक प्रोग्राम बनाएंगे।

संपादन कार्यक्रम.cs (रेजर पेज, एमवीसी कॉमन)

Program.cs में कुकी प्रमाणीकरण के लिए आवश्यक परिभाषाएँ जोड़ें। जोड़े जाने वाले नामस्थान निम्नानुसार हैं:

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

builder.Services यहां जोड़ने के लिए कोड है।

// === 省略 ===

// 「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 आप निष्पादित करके कुकी प्रमाणीकरण सक्षम कर सकते हैं और विधि। यदि आपको योजना का नाम बदलने की आवश्यकता नहीं है, CookieAuthenticationDefaults.AuthenticationScheme तो निर्दिष्ट करें।

AddAuthorization यदि आप options.FallbackPolicy RequireAuthenticatedUser विधि के लिए निर्दिष्ट करते हैं आप सभी पृष्ठों, सभी नियंत्रकों और क्रियाओं पर प्रमाणीकरण-आवश्यक नीति लागू कर सकते हैं. यदि आप लॉगिन स्क्रीन के अलावा किसी अन्य चीज़ के लिए प्रमाणीकरण की आवश्यकता चाहते हैं, तो यह कोड को कम करने और विवरण में त्रुटियों को रोकने के मामले में एक उपयोगी तरीका है। आपको कोड लिखना होगा जिसमें लॉगिन स्क्रीन के लिए अलग से प्रमाणीकरण की आवश्यकता नहीं है।

के लिए कोड निम्नलिखित है app

// === 省略 ===

app.UseRouting();

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

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

// === 省略 ===

चूंकि हम एप्लिकेशन में प्रमाणीकरण कार्यक्षमता जोड़ना चाहते हैं, app.UseAuthentication() इसलिए हम जोड़ देंगे . विवरण स्थान MSDN दस्तावेज़ीकरण, ऐप के अनुसार है। UseAuthorization() का उपयोग करें। इसके अलावा, यह अभी भी एक टेम्पलेट है।

रेजर पेज परियोजनाओं के लिए कार्यक्रम

एक लॉगिन पेज बनाएं (Pages/Account/Login.cshtml.cs)

कोई फ़ाइल बनाना

एक लॉगिन पेज बनाएं। फ़ाइल पथ को "/Pages/Account/Login.cshtml" के रूप में बनाया जाना चाहिए। ऐसा इसलिए है क्योंकि डिफ़ॉल्ट लॉगिन पथ ऐसा ही है। यदि आप इस पथ को बदलना चाहते हैं, तो आप Program.cs AddCookie .

आप इसे मेनू से बनाने के बजाय अन्य फ़ाइलों को कॉपी करके बना सकते हैं, लेकिन उस स्थिति में, कृपया प्रोग्राम को सही ढंग से ठीक करें।

उपयोगकर्ताओं को लॉग इन किए बिना लॉगिन पृष्ठ तक पहुंचने की अनुमति दें

Program.cs चूंकि सभी पृष्ठों को केवल लॉग इन होने पर ही एक्सेस किया जा सकता है, इसलिए आपको केवल लॉगिन पेज सेट करना होगा ताकि आप लॉग इन न होने पर भी इसे एक्सेस कर सकें।

AllowAnonymous विशेषताओं को जोड़कर, लक्ष्य पृष्ठ को प्रमाणित न होने पर भी एक्सेस किया जा सकता है। AllowAnonymous विशेषताओं का उपयोग लॉगिन स्क्रीन के अलावा अन्य स्थानों में किया जा सकता है, जैसे कि कुकी प्रमाणीकरण से असंबंधित API संचालन.

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

इनपुट प्राप्त करने के लिए एक चर बनाएं

जब आप लॉग इन करते हैं, तो आप अपना उपयोगकर्ता नाम उन मानों को प्राप्त करने में सक्षम होने की घोषणा करते हैं क्योंकि आप अपना पासवर्ड दर्ज करते हैं।

// 省略

[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; } = "";
}

लॉगिन प्रमाणीकरण के लिए एक उपयोगकर्ता नाम और पासवर्ड परिभाषित करें

मूल रूप से, इसे डेटाबेस आदि में संग्रहीत किया जाएगा, लेकिन चूंकि उपयोगकर्ता निर्णय इस बार मुख्य फोकस नहीं है, इसलिए मैं इसे एक अस्थायी स्थान के रूप में बनाऊंगा।

// 省略

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

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

लॉगिन प्रक्रिया

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

लॉगिन बटन दबाने के बाद यह प्रमाणीकरण प्रक्रिया है। यदि उपयोगकर्ता नाम और पासवर्ड मेल खाते हैं, तो प्रमाणीकरण संभव है।

वर्णित कोड प्रमाणीकरण के लिए आवश्यक न्यूनतम कोड है,ClaimClaimsIdentityClaimsPrincipal और HttpContext.SignInAsync विधि को कॉल करके, एक कुकी उत्पन्न और प्रमाणित की जाती है।

यदि अतिरिक्त दावों की आवश्यकता होती है या कुकी समाप्ति आवश्यक होती है, तो अतिरिक्त पैरामीटर जोड़े जाते हैं।

लॉग इन करने के बाद, आपको रीडायरेक्ट किया जाता है, जहां /Index प्रमाणीकरण की आवश्यकता होती है।

लॉगआउट प्रक्रिया

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

Logout जब एक हैंडलर के साथ पहुँचा जाता है, तो इसे लॉग आउट करने के लिए संसाधित किया जाता है। HttpContext.SignOutAsync विधि को कॉल करके, आप कुकी को हटा सकते हैं और इसे उस स्थिति में वापस कर सकते हैं जहां आप लॉग इन नहीं हैं।

एक दृश्य बनाना

हम उपस्थिति को ध्यान में नहीं रखते हैं। नीचे दिखाए गए अनुसार अपना उपयोगकर्ता नाम और पासवर्ड दर्ज करने के लिए फ़ील्ड जोड़ें, और लॉग इन करने के लिए एक बटन रखें। आपके पास परीक्षण के लिए लॉग इन किए बिना एक्सेस करने के लिए /Index एक लिंक भी होना चाहिए।

चूंकि उपयोगकर्ता नाम और पासवर्ड दर्ज करना परेशानी भरा है, इसलिए प्रारंभिक मान सेट किया गया है।

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

एक लॉगआउट लिंक बनाएं (/Pages/Shared/_Layout.cshtml)

हम होम स्क्रीन में कोई बदलाव नहीं करेंगे, लेकिन हम नेविगेशन बार में एक लॉगआउट लिंक डालेंगे। इसके अलावा, परीक्षण के लिए, एक लिंक पोस्ट करें जो आपको लॉग आउट किए बिना लॉगिन स्क्रीन पर ले जाता है।

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

रेजर पेज कोड के लिए बस इतना ही।

एमवीसी परियोजनाओं के लिए कार्यक्रम

लॉगिन मॉडल बनाना

आपने लॉगिन स्क्रीन पर दर्ज किए गए मानों को प्राप्त करने के लिए एक मॉडल बनाया है।

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; } = "";
  }
}

एक खाता नियंत्रक बनाना

लॉगिन स्क्रीन बनाने के लिए आवश्यक नियंत्रक और क्रियाएं बनाएं। के रूप में नियंत्रक नाम AccountController बनाएँ। ऐसा इसलिए है क्योंकि डिफ़ॉल्ट रूप से, लॉगिन स्क्रीन पर नियंत्रक का नाम और कार्रवाई का नाम "~/खाता/लॉगिन" पर सेट होता है। यदि आप इस पथ को बदलना चाहते हैं, तो आप प्रोग्राम.cs में विधि के AddCookie विकल्पों में ऐसा कर सकते हैं। अभी के लिए, हम डिफ़ॉल्ट सेटिंग्स के साथ आगे बढ़ेंगे।

सबसे पहले, कंट्रोलर साइड बनाते हैं।

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 विशेषता प्रदान करके, इसमें सभी कार्यों को प्रमाणित किए बिना किया जा सकता है। यह आपको प्रमाणीकरण के बिना केवल लॉगिन स्क्रीन तक पहुंचने की अनुमति देता है।

AllowAnonymous विशेषताओं का उपयोग एपीआई-केवल नियंत्रकों में भी किया जा सकता है जो लॉगिन स्क्रीन के अलावा अन्य स्थानों में कुकी प्रमाणीकरण से संबंधित नहीं हैं।

इसके बाद, उन उपयोगकर्ताओं और पासवर्डों को परिभाषित करें जो लॉग इन कर सकते हैं। मूल रूप से, इसे डेटाबेस आदि में संग्रहीत किया जाएगा, लेकिन चूंकि उपयोगकर्ता निर्णय इस बार मुख्य फोकस नहीं है, इसलिए मैं इसे एक अस्थायी स्थान के रूप में बनाऊंगा।

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

निम्नलिखित एक क्रिया है जो लॉगिन स्क्रीन प्रदर्शित करती है। चूंकि यह केवल प्रदर्शित होता है, यह दृश्य को वैसे ही लौटाता है।

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

लॉग इन करते समय संसाधित किया जाने वाला कोड नीचे दिया गया है।

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

लॉगिन बटन दबाने के बाद यह प्रमाणीकरण प्रक्रिया है। यदि उपयोगकर्ता नाम और पासवर्ड मेल खाते हैं, तो प्रमाणीकरण संभव है।

वर्णित कोड प्रमाणीकरण के लिए आवश्यक न्यूनतम कोड है,ClaimClaimsIdentityClaimsPrincipal और HttpContext.SignInAsync विधि को कॉल करके, एक कुकी उत्पन्न और प्रमाणित की जाती है।

यदि अतिरिक्त दावों की आवश्यकता होती है या कुकी समाप्ति आवश्यक होती है, तो अतिरिक्त पैरामीटर जोड़े जाते हैं।

लॉग इन करने के बाद, आपको रीडायरेक्ट किया जाता है, जहां ~/Home/Index प्रमाणीकरण की आवश्यकता होती है।

अंत में, लॉगआउट प्रक्रिया जोड़ी जाती है।

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

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

HttpContext.SignOutAsync विधि को कॉल करके, आप कुकी को हटा सकते हैं और इसे उस स्थिति में वापस कर सकते हैं जहां आप लॉग इन नहीं हैं।

एक दृश्य बनाएं (लॉगिन फ़ॉर्म) (/Views/Account/Login.cshtml)

Login दृश्य जोड़ने के लिए क्रिया पर राइट-क्लिक करें. आप इसे किसी अन्य फ़ाइल से कॉपी करके भी बना सकते हैं।

हम उपस्थिति को ध्यान में नहीं रखते हैं। नीचे दिखाए गए अनुसार अपना उपयोगकर्ता नाम और पासवर्ड दर्ज करने के लिए फ़ील्ड जोड़ें, और लॉग इन करने के लिए एक बटन रखें। आपके पास परीक्षण के लिए लॉग इन किए बिना एक्सेस करने के लिए Home/Index एक लिंक भी होना चाहिए।

चूंकि उपयोगकर्ता नाम और पासवर्ड दर्ज करना परेशानी भरा है, इसलिए प्रारंभिक मान सेट किया गया है।

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

एक लॉगआउट लिंक बनाएं (/Views/Shared/_Layout.cshtml)

हम होम स्क्रीन में कोई बदलाव नहीं करेंगे, लेकिन हम नेविगेशन बार में एक लॉगआउट लिंक डालेंगे। इसके अलावा, परीक्षण के लिए, एक लिंक पोस्ट करें जो आपको लॉग आउट किए बिना लॉगिन स्क्रीन पर ले जाता है।

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

यह एमवीसी कोड के लिए है।

ऑपरेशन की पुष्टि

यह कुकी प्रमाणीकरण के न्यूनतम आवश्यक कार्यान्वयन को पूरा करता है। इसे चलाने की कोशिश करें और देखें कि यह कैसे काम करता है। व्यवहार इस बात पर निर्भर करता है कि आप लॉग इन हैं या नहीं। एक साधारण उदाहरण के रूप में, आप निम्न व्यवहार देख सकते हैं।

ऑपरेशन
ऑपरेशन परिणाम
बिना लॉग इन किए घर जाएं लॉगिन स्क्रीन पर रीडायरेक्ट करें
लॉगिन होम स्क्रीन पर जाएं
घर से लॉग आउट करें और बिना लॉग इन किए घर जाएं लॉगिन स्क्रीन पर रीडायरेक्ट करें
घर से बाहर लॉग इन किए बिना और लॉग इन किए बिना घर जाएं होम स्क्रीन पर जाएं