ایک سے زیادہ لاگ ان اسکرینیں بنائیں اور ان صفحات کو محدود کریں جن تک آپ لاگ ان ہیں اس اسکرین کے ذریعہ رسائی حاصل کی جاسکتی ہے۔

جب صفحے کی تازہ کاری :
صفحہ تخلیق تاریخ :

آپریٹنگ ماحول

Visual Studio
  • Visual Studio Community 2022
ASP.NET کور (ایم وی سی، ریزر صفحات)
6.0

سب سے پہلے

یہ سیکشن بیان کرتا ہے کہ ایک ایپلی کیشن میں متعدد لاگ ان اسکرینیں کیسے تیار کی جائیں اور ان صفحات کو الگ کیا جائے جن تک ہر لاگ ان اسکرین کے ذریعہ رسائی حاصل کی جاسکتی ہے۔ سنگل لاگ ان اسکرین بنانے کا طریقہ "کوکی تصدیق کا استعمال کرتے ہوئے لاگ ان میکانزم بنانا اور اگر آپ تصدیق شدہ نہیں ہیں تو ری ڈائریکٹ کرنے کے لئے ایک میکانزم بنانا" میں وضاحت کی گئی ہے، اور اس مواد کی وضاحت اس مفروضے پر کی گئی ہے کہ آپ کو سنگل لاگ ان اسکرین بنانے کا علم ہے۔ لہذا ، سنگل لاگ ان اسکرین کی طرح ہی عمل صرف ایک سادہ وضاحت ہے۔

ایک منصوبہ بنائیں

میں ریزر صفحات اور ایم وی سی نمونہ بنا رہا ہوں ، لیکن صرف وہی پروجیکٹ بنانا ٹھیک ہے جو آپ استعمال کرنا چاہتے ہیں۔

پروگرام میں ترمیم کریں.cs (ریزر صفحات، ایم وی سی کامن)

اس بار ، ہم ان صفحات کو الگ کرنے کا طریقہ استعمال کریں گے جن تک لاگ ان صفحے کے ذریعہ "اسکیما" کے نام سے رسائی حاصل کی جاسکتی ہے۔

سب سے پہلے ، کوڈ کے اوپری حصے میں نام کی جگہ شامل کریں۔

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

مندرجہ ذیل ایک بلڈر ہے. خدمات میں شامل کرنے کے لئے کوڈ.

// === 省略 ===

// 「Razor Pages」のコード
// builder.Services.AddRazorPages();
// 「MVC」のコード
// builder.Services.AddControllersWithViews();

// ※ここから追加

// Cookie による認証スキームを追加する
builder.Services
  .AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
  .AddCookie("FirstAuth", option =>
  {
    option.LoginPath = "/Account/LoginFirst";
  })
  .AddCookie("SecondAuth", option =>
  {
    option.LoginPath = "/Account/LoginSecond";
  });

builder.Services.AddAuthorization(options =>
{
  // 認証属性を設定していない画面は FirstAuth スキーマの認証が必要となる
  options.FallbackPolicy = new AuthorizationPolicyBuilder("FirstAuth")
    .RequireAuthenticatedUser()
    .Build();
});

// ※ここまで追加

var app = builder.Build();

// === 省略 ===

پچھلی بار سے فرق یہ ہے کہ کوکیز کو دو میں شامل کیا جاتا ہے. AddCookie ہر ایک کی پہلی دلیل میں اسکیما نام ہوتا ہے جو لاگ ان کی شناخت کرتا ہے۔ یہ نام کچھ بھی ہوسکتا ہے جب تک کہ یہ ایک مختلف نام ہے. دوسری دلیل لاگ ان پیج یو آر ایل ہے جسے لاگ ان کیے بغیر لاگ ان تک رسائی حاصل ہونے پر ری ڈائریکٹ کیا جائے گا۔ ویسے ، اگر آپ اسکیما نام کی وضاحت نہیں کرتے ہیں تو ، یہ CookieAuthenticationDefaults.AuthenticationScheme اسی طرح ہوگا۔

FallbackPolicy یہ اسکیما کو ترتیب FirstAuth کے طور پر بھی بیان کرتا ہے۔ اس کے نتیجے FirstAuth میں ، اس اچھوتی Index.cshtml یا Privacy.cshtml اسکیما توثیق تک رسائی کی ضرورت ہے۔

مندرجہ ذیل ایپ کا کوڈ ایک ہی لاگ ان کے لئے وہی ہے۔

// === 省略 ===

app.UseRouting();

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

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

// === 省略 ===

ریزر صفحات کے منصوبوں کے لئے پروگرام

لاگ ان کرنے کے بعد ایک صفحہ بنانا

لاگ ان کرنے کے بعد دو صفحات بنائیں۔ چونکہ یہ ایک ایسا صفحہ ہے جو صرف ظاہر ہوتا ہے ، لہذا اگر آپ اسے بناتے ہیں تو یہ ٹھیک ہے تاکہ آپ دیکھ سکیں کہ آپ کہاں لاگ ان ہیں۔

Pages/IndexFirst.cshtml

@page
@model IndexFirstModel
@{
  ViewData["Title"] = "First page";
}

<div class="text-center">
    <h1 class="display-4">First Page</h1>
</div>

اس کے بارے میں کچھ خاص طور پر اہم نہیں ہے ، لیکن اس بات کو یقینی بنائیں کہ آپ جس ماڈل کا حوالہ دے رہے ہیں وہ آپ کے بنائے ہوئے صفحے سے IndexFirstModel میل کھاتا ہے ، جیسے ۔

Pages/IndexFirst.cshtml.cs

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace CookieAuthenticationMultipleRazorPages.Pages
{
  [Authorize(AuthenticationSchemes = "FirstAuth")]
  public class IndexFirstModel : PageModel
  {
    private readonly ILogger<IndexFirstModel> _logger;

    public IndexFirstModel(ILogger<IndexFirstModel> logger)
    {
      _logger = logger;
    }

    public void OnGet() { }
  }
}

کوئی خاص ہینڈلنگ نہیں ہے کیونکہ یہ صرف ظاہر ہوتا ہے ، لیکن نوٹ کریں کہ ہم نے کلاس کے نام کی خصوصیت کے Authorize طور پر شامل کیا ہے۔ AuthenticationSchemes دلیل پروگرام .cs میں بیان کردہ اسکیما نام پر سیٹ کی گئی ہے۔ یہ اس بات کو یقینی بناتا ہے کہ آپ اس صفحے کو صرف اسی صورت میں دیکھ سکتے ہیں جب آپ اس اسکیما نام سے لاگ ان کرتے ہیں۔ اگر آپ لاگ ان کیے بغیر اس صفحے پر جاتے ہیں تو ، آپ کو لاگ ان صفحے پر ری ڈائریکٹ کیا جائے گا۔

Pages/IndexSecond.cshtml

لاگ ان کے بعد یہ دوسرا صفحہ ہے۔

@page
@model IndexSecondModel
@{
  ViewData["Title"] = "Second page";
}

<div class="text-center">
  <h1 class="display-4">Second Page</h1>
</div>

Pages/IndexSecond.cshtml.cs

نوٹ کریں کہ کوڈ بنیادی طور پر پہلے لاگ ان صفحے جیسا ہی ہے ، لیکن اسکیما کا نام مختلف ہے۔

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace CookieAuthenticationMultipleRazorPages.Pages
{
  [Authorize(AuthenticationSchemes = "SecondAuth")]
  public class IndexSecondModel : PageModel
  {
    private readonly ILogger<IndexSecondModel> _logger;

    public IndexSecondModel(ILogger<IndexSecondModel> logger)
    {
      _logger = logger;
    }

    public void OnGet() { }
  }
}

لاگ ان پیج بنانا

دو لاگ ان صفحات بنائیں۔

Pages/Account/LoginFirst.cshtml.cs

خصوصیت کو شامل کریں تاکہ آپ لاگ ان کیے بغیر AllowAnonymous اس تک رسائی حاصل کرسکیں۔

using Microsoft.AspNetCore.Authentication;
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 CookieAuthenticationMultipleRazorPages.Pages.Account
{
  [AllowAnonymous]
  public class LoginFirstModel : PageModel
  {
  }
}

اپنے داخل کردہ لاگ ان کی معلومات کو حاصل کرنے کے لئے ایک متغیر اور ایک ڈمی صارف اکاؤنٹ بنائیں۔

[AllowAnonymous]
public class LoginFirstModel : PageModel
{
  /// <summary>ユーザー名。</summary>
  [BindProperty]
  [Required]
  [DisplayName("ユーザー名")]
  public string UserName { get; set; } = "";

  /// <summary>パスワード。</summary>
  [BindProperty]
  [Required]
  [DataType(DataType.Password)]
  [DisplayName("パスワード")]
  public string Password { get; set; } = "";

  /// <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, "FirstAuth");
  var principal = new ClaimsPrincipal(identity);

  // 認証クッキーをレスポンスに追加
  await HttpContext.SignInAsync("FirstAuth", principal);

  // ログインが必要な画面にリダイレクトします
  return RedirectToPage("/IndexFirst");
}

ایک ہی لاگ ان سے فرق یہ ہے کہ ہر اسکیما نام کی وضاحت کی گئی ہے۔ آپ جس مقام کی وضاحت کرتے ہیں وہ دلیل HttpContext.SignInAsync اور استدلال ہےClaimsIdentity۔ یہاں آپ وضاحت کرسکتے ہیں کہ آپ کس اسکیما کے ساتھ لاگ ان کرنا چاہتے ہیں۔

لاگ آؤٹ اسکیما نام کی وضاحت کی شکل میں بھی ہے۔

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

Pages/Account/LoginFirst.cshtml

ویو سائیڈ ایک ہی لاگ ان سے مختلف نہیں ہے۔ براہ کرم ماڈل کے نام کا حوالہ دینے کے لئے میچ کریں۔

@page
@model LoginFirstModel
@{}

<p>Login1</p>

<form method="post">
  <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="/IndexFirst">認証が必要な画面へ直接リンク</a>
    </div>
  </div>
</form>

@section Scripts {
  @{
    await Html.RenderPartialAsync("_ValidationScriptsPartial");
  }
}

Pages/Account/LoginSecond.cshtml.cs

یہاں ایک اور لاگ ان منطق ہے. First Second یہ صرف مختلف ہے.

using Microsoft.AspNetCore.Authentication;
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 CookieAuthenticationMultipleRazorPages.Pages.Account
{
  [AllowAnonymous]
  public class LoginSecondModel : PageModel
  {
    /// <summary>ユーザー名。</summary>
    [BindProperty]
    [Required]
    [DisplayName("ユーザー名")]
    public string UserName { get; set; } = "";

    /// <summary>パスワード。</summary>
    [BindProperty]
    [Required]
    [DataType(DataType.Password)]
    [DisplayName("パスワード")]
    public string Password { get; set; } = "";

    /// <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, "SecondAuth");
      var principal = new ClaimsPrincipal(identity);

      // 認証クッキーをレスポンスに追加
      await HttpContext.SignInAsync("SecondAuth", principal);

      // ログインが必要な画面にリダイレクトします
      return RedirectToPage("/IndexSecond");
    }

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

Pages/Account/LoginSecond.cshtml

منظر. First یہ صرف اتنا ہی ہے اور Second مختلف ہے.

@page
@model LoginSecondModel
@{}

<p>Login Second</p>

<form method="post">
  <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="/IndexSecond">認証が必要な画面へ直接リンク</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/LoginFirst" asp-page-handler="Logout">ログアウト(First)</a>
    </li>
    <li class="nav-item">
      <a class="nav-link text-dark" asp-page="/Account/LoginFirst">ログアウトせずログインへ(First)</a>
    </li>
    <li class="nav-item">
      <a class="nav-link text-dark" asp-page="/Account/LoginSecond" asp-page-handler="Logout">ログアウト(Second)</a>
    </li>
    <li class="nav-item">
      <a class="nav-link text-dark" asp-page="/Account/LoginSecond">ログアウトせずログインへ(Second)</a>
    </li>
    <li class="nav-item">
      <a class="nav-link text-dark" asp-page="/IndexFirst">IndexFirst</a>
    </li>
    <li class="nav-item">
      <a class="nav-link text-dark" asp-page="/IndexSecond">IndexSecond</a>
    </li>
    <!-- ここまで追加 -->
  </ul>
</div>
<!-- 中略 -->

ایم وی سی منصوبوں کے لئے پروگرام

لاگ ان ماڈل بنانا

اس بار ، دو لاگ ان اسکرینوں کی ان پٹ اقدار ایک جیسی ہیں ، لہذا ہم ان کا اشتراک کریں گے اور صرف ایک بنائیں گے۔

using System.ComponentModel;
using System.ComponentModel.DataAnnotations;

namespace CookieAuthenticationMultipleMvc.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 ، لہذا آپ کو صرف ایک کنٹرولر شامل کرنے کی ضرورت ہے۔

AllowAnonymous اسے خصوصیت دیں تاکہ آپ لاگ ان کیے بغیر اس تک رسائی حاصل کرسکیں۔

using CookieAuthenticationMultipleMvc.Models;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.Security.Claims;

namespace CookieAuthenticationMultipleMvc.Controllers
{
  /// <remarks>
  /// <see cref="AllowAnonymous"/> 属性は Cookie 認証していなくてもアクセスできる Action (Controller) であることを示す。
  /// </remarks>
  [AllowAnonymous]
  public class AccountController : Controller
  {
  }
}

ایک ڈمی صارف اکاؤنٹ بنائیں۔

[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 LoginFirst() => View();

ذیل میں لاگ ان کرتے وقت پروسیس کیا جانے والا کوڈ ہے۔

/// <summary>ログイン処理を実行します。</summary>
[HttpPost]
public async Task<IActionResult> LoginFirst(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, "FirstAuth");
  var principal = new ClaimsPrincipal(identity);

  // 認証クッキーをレスポンスに追加
  await HttpContext.SignInAsync("FirstAuth", principal);

  // ログインが必要な画面にリダイレクトします
  return RedirectToAction(nameof(HomeController.Index), "HomeFirst");
}

ایک ہی لاگ ان سے فرق یہ ہے کہ ہر اسکیما نام کی وضاحت کی گئی ہے۔ آپ جس مقام کی وضاحت کرتے ہیں وہ دلیل HttpContext.SignInAsync اور استدلال ہےClaimsIdentity۔ یہاں آپ وضاحت کرسکتے ہیں کہ آپ کس اسکیما کے ساتھ لاگ ان کرنا چاہتے ہیں۔

لاگ آؤٹ اسکیما نام کی وضاحت کی شکل میں بھی ہے۔

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

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

میں دوسرا لاگ ان بھی شامل کروں گا۔ First صرف اس کے حصے Second کو تبدیل کرنے سے کوئی دوسرا فرق نہیں ہے۔

// 中略

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

/// <summary>ログイン処理を実行します。</summary>
[HttpPost]
public async Task<IActionResult> LoginSecond(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, "SecondAuth");
  var principal = new ClaimsPrincipal(identity);

  // 認証クッキーをレスポンスに追加
  await HttpContext.SignInAsync("SecondAuth", principal);

  // ログインが必要な画面にリダイレクトします
  return RedirectToAction(nameof(HomeController.Index), "HomeSecond");
}

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

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

// 中略

ایک منظر بنانا (لاگ ان فارم)

ہر ایک کو دو نظارے بنائیں۔

ایک لاگ ان اور کوڈ کے درمیان زیادہ فرق نہیں ہے ، لہذا میں کوڈ کو اسی طرح پوسٹ کروں گا جیسے یہ ہے۔

Views/Account/LoginFirst.cshtml

@model LoginModel
@{}

<h1>Login First</h1>

<form asp-action="LoginFirst">
  <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="HomeFirst" asp-action="Index">認証が必要な画面へ直接リンク</a>
    </div>
  </div>
</form>

@section Scripts {
  @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
}

Views/Account/LoginSecond.cshtml

@model LoginModel
@{}

<h1>Login Second</h1>

<form asp-action="LoginSecond">
  <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="HomeSecond" asp-action="Index">認証が必要な画面へ直接リンク</a>
    </div>
  </div>
</form>

@section Scripts {
  @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
}

لاگ ان کے بعد اسکرین کی تخلیق

HomeController موجودہ ایک کو استعمال کیے بغیر دو نئے کنٹرولر بنائیں۔ یہ وہ کنٹرولر ہیں جن تک آپ لاگ ان کرنے کے بعد رسائی حاصل کرسکتے ہیں۔ آپ نے جس اسکرین میں لاگ ان کیا ہے اس پر منحصر ہے کہ ہر اسکرین مختلف طریقے سے قابل رسائی ہوگی۔

HomeFirstController.cs

چونکہ یہ صرف اسکرین دکھاتا ہے ، لہذا پروسیسنگ شامل کرنے کے لئے کچھ بھی نہیں ہے۔

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace CookieAuthenticationMultipleMvc.Controllers
{
  [Authorize(AuthenticationSchemes = "FirstAuth")]
  public class HomeFirstController : Controller
  {
    public IActionResult Index() => View();
  }
}

اس کے بجائے ، یہ کنٹرولر کو ایک خصوصیت منسلک کرتا ہے اور AuthenticationSchemes ایک دلیل کے طور پر اسکیما نام کی وضاحت کرتا ہےAuthorize۔ FirstAuth یہ اس بات کو یقینی بناتا ہے کہ آپ صرف اس کنٹرولر تک رسائی حاصل کرسکتے ہیں اگر آپ اسکیما کے ساتھ تصدیق کر رہے ہیں۔

HomeSecondController.cs

Second اسی طرح سائیڈ بنائیں۔

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace CookieAuthenticationMultipleMvc.Controllers
{
  [Authorize(AuthenticationSchemes = "SecondAuth")]
  public class HomeSecondController : Controller
  {
    public IActionResult Index() => View();
  }
}

Views/HomeFirst/Index.cshtml

کچھ خاص طور پر مشکل نہیں ہے کیونکہ یہ صرف دکھایا جاتا ہے. انہیں الگ کریں تاکہ آپ دیکھ سکیں کہ یہ کون سا صفحہ ہے۔

@{
  ViewData["Title"] = "First View";
}

<div class="text-center">
  <h1 class="display-4">First View</h1>
</div>

Views/HomeSecond/Index.cshtml

بس اسے یہاں بھی دکھائیں.

@{
  ViewData["Title"] = "Second View";
}

<div class="text-center">
  <h1 class="display-4">Second View</h1>
</div>

Views/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-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="LogoutFirst">ログアウト(First)</a>
    </li>
    <li class="nav-item">
      <a class="nav-link text-dark" asp-controller="Account" asp-action="LoginFirst">ログアウトせずログインへ(First)</a>
    </li>
    <li class="nav-item">
      <a class="nav-link text-dark" asp-controller="Account" asp-action="LogoutSecond">ログアウト(Second)</a>
    </li>
    <li class="nav-item">
      <a class="nav-link text-dark" asp-controller="Account" asp-action="LoginSecond">ログアウトせずログインへ(Second)</a>
    </li>
    <li class="nav-item">
      <a class="nav-link text-dark" asp-controller="HomeFirst" asp-action="Index">IndexFirst</a>
    </li>
    <li class="nav-item">
      <a class="nav-link text-dark" asp-controller="HomeSecond" asp-action="Index">IndexSecond</a>
    </li>
    <!-- ここまで追加 -->
  </ul>
</div>
<!-- 中略 -->

آپریشن کی تصدیق

براہ کرم اسے چلائیں کہ یہ کیسے کام کرتا ہے۔ مجھے یقین ہے کہ آپ پہلے ہی سنگل لاگ ان کا کام دیکھ چکے ہیں، لہذا مجھے لگتا ہے کہ یہ چیک کرنا ایک اچھا خیال ہے کہ جب آپ لاگ ان اسٹیٹس کو مندرجہ ذیل پیٹرن میں رکھتے ہیں تو ہر اسکرین تک رسائی حاصل کرتے وقت کیا ہوتا ہے۔

  • نہ پہلے اور نہ ہی دوسرے لاگ ان ہیں
  • پہلا لاگ ان ہے اور دوسرا لاگ ان نہیں ہے۔
  • پہلا لاگ ان نہیں ہے، دوسرا لاگ ان ہے
  • پہلا اور دوسرا دونوں لاگ ان ہیں