اگر آپ کوکی تصدیق کا استعمال کرتے ہوئے لاگ ان نہیں کرتے ہیں تو ری ڈائریکٹ ہونے کے لئے ایک میکانزم بنائیں (ASP.NET کور 3.0)

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

ماحول

بصری سٹوڈیو
  • بصری سٹوڈیو کمیونٹی 2019
ASP.NET کور
3.0 یا اس کے بعد

کوکی کی توثیق .NET کور 2.2 یا اس سے پہلے میں استعمال کیا جا سکتا ہے ، لیکن ہماری تجاویز خاص طور پر .NET کور 3.0 اور بعد میں کوڈ شامل ہیں.

پہلے

ASP.NET کور ایک لاگ ان کی توثیق میکانزم کے طور پر کوکی توثیق کا استعمال کرتا ہے. آپ کوکیز کی توثیق کے بارے میں سوچ سکتے ہیں جیسا کہ روایتی فارم کی توثیق کی طرح کچھ ہے.

ASP.NET کور کی توثیق کرنے کا ایک اور طریقہ ASP.NET بنیادی شناخت ہے. فارم ، api کی توثیق ، بیرونی لاگ ان کی خدمات ، پاس ورڈ مینجمنٹ اور ری سیٹ ، وغیرہ کا استعمال کرتے ہوئے تصدیق کے علاوہ میں. آپ بہت سے افعال استعمال کر سکتے ہیں. تاہم ، صرف اس وقت ایک سادہ لاگ ان کی سکرین بنانے کے نقطہ نظر سے ، یہ تھوڑا سا مبالغہ تصدیق کا ایک طریقہ کار بن جاتا ہے میں اس وقت استعمال نہیں کرتے.

کوکی کی تصدیق کے لئے تجاویز میں ، آپ لاگ ان کی سکرین کے علاوہ کچھ بھی نہیں دکھا سکتے ہیں جب تک کہ آپ ان کا اندراج نہ کریں. اگر آپ ایک مختلف اسکرین پر جانے کی کوشش کرتے ہیں ، تو آپ کو لاگ ان کی سکرین پر ری ڈائریکٹ کیا جائے گا. آپ لاگ ان کرکے دیگر اسکرینوں کو بھی دیکھ سکتے ہیں.

ایک بار جب آپ لاگ ان کی سکرین پر اپنا صارف نام اور پاس ورڈ درج, آپ میں لاگ ان کر سکتے ہیں. صارف کی تصدیق ایک عارضی پوزیشن میں لاگو کیا جاتا ہے. چونکہ کوکی کی توثیق کا بنیادی نفاذ اس وقت آخری ہے ، فیصلے کے عمل ، جیسے کہ پاس ورڈ درست ہے ، ضروری نہیں ہے.

یہ تجاویز پروگرام سپارٹل کی فہرستیں ہیں ۔ مکمل کوڈ کے لئے مکمل پروگرام ڈاؤن لوڈ کریں ۔

ایک پروجیکٹ بنائیں

بصری سٹوڈیو شروع کریں اور ایک نیا پروجیکٹ بنائیں.

image

ASP.NET کور ویب اپلیکیشن منتخب کریں ۔

image

کسی پراجیکٹ نام اور پراجیکٹ محل وقوع کا اختصاص کریں ۔

image

اس بار ، ہم mvc منصوبوں کا استعمال کریں گے ، لیکن زیادہ سے زیادہ دیگر سانچوں کو متبادل کیا جا سکتا ہے.

توثیق کے لیے ، توثیق منتخب کریں ۔ اگر آپ دیگر توثیق کا انتخاب کرتے ہیں تو آپ ASP.NET بنیادی شناخت استعمال کریں گے ۔

image

ایک پروجیکٹ بنانے اور اسے ٹھیک کرنے کے بعد, نیچے دی گئی اعداد و شمار میں سکرین ظاہر ہوتا ہے. ہم اس اسکرین کی بنیاد پر ایک پروگرام تخلیق کریں گے ۔

image

Startup.cs تدوین کریں

Startup.cs کوکی توثیق کے لیے درکار تعریف کا اضافہ کریں ۔ کرپٹرافی استعمال:

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;

آپ کو اضافی تصدیق اور اضافی کوکی کے طریقوں کو چلانے کی طرف سے کوکی کی توثیق کو فعال کر سکتے ہیں. اگر آپ کو خاص طور پر سکیم کا نام تبدیل کرنے کی ضرورت نہیں ہے تو کوکیاوتانٹاکاٹاونڈیفاولٹ. اوٹہانٹاکاٹاونسکہیمی کی وضاحت کریں.

اضافی اختیار کے طریقہ کار کے اختیارات. اگر آپ فاللباککپولاسی میں ریقواریوتانٹاکاٹیدوسر کی وضاحت کرتے ہیں تو ، تمام کنٹرولرز ایک تصدیقی-ضروری پالیسی عمل پر لاگو ہو سکتا ہے ۔ یہ بھی اس معنی میں مفید ہے کہ کوڈ کو کم کیا جاتا ہے اور وضاحت کی غلطی کو روک دیا جاتا ہے اگر تصدیق لاگ ان اسکرین کے علاوہ دوسرے کی ضرورت ہے. صرف لاگ ان اسکرین کوڈ کو لکھیں گے جو انفرادی طور پر توثیق کی ضرورت نہیں ہے.

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 دستاویزی تائید پر مبنی ہے ۔ اسیاوٹہورازاشن کے سامنے جگہ (). باقی سب کچھ ایک ٹیمپلیٹ رہتا ہے.

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

ایک اککوونٹکونٹروللر بنانا

آپ کو ایک لاگ ان کی سکرین بنانے کے لئے کی ضرورت ہے کہ کنٹرولرز اور اعمال بنائیں. کنٹرولر نام اککوونٹکونٹروللر کے طور پر بنایا جاتا ہے. اس کی وجہ سے ڈیفالٹ کی طرف سے ہے ، لاگ ان کی سکرین کا کنٹرولر نام اور عمل کا نام "~/Account/Login" ہونے کا تعین کیا جاتا ہے. اگر آپ اس راستے کو تبدیل کرنا چاہتے ہیں تو ، آپ کو Startup.cs میں اضافی کوکی کے طریقہ کار کے اختیارات کے ساتھ تبدیل کر سکتے ہیں. ہم ڈیفالٹ ترتیبات کے ساتھ جائیں گے.

image

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

اللووانونیمووس خصوصیت لاگ ان اسکرین کے علاوہ ایک مقام کے طور پر کوکی کی توثیق سے آزاد ہے. یہ بھی 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();
}

لاگ ان بٹن دبانے کے بعد توثیق کے عمل. اگر صارف نام اور پاس ورڈ مشابہ ہو تو اس کی توثیق ہو سکتی ہے ۔

درج ذیل کوڈ توثیق ، شناخت ، اور پراکانپال کے لیے ضروری ہے کہ وہ کم ازکم کوڈ کی تصدیق کریں ۔ ہٹپکونٹی. ساگناناسینک طریقہ کار کو بلا کوکی پیدا کرتا ہے اور اسے توثیق ہے ۔

اگر اضافی دعووں کی ضرورت ہو یا کوکیز ختم ہوجائے تو ، پیرامیٹرز شامل کریں.

لاگ ان کرنے کے بعد ، ہم نے ~/ہوم/انڈیکس کی طرف رجوع کیا ہے ، جس کی توثیق کی ضرورت ہوتی ہے.

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

لاگ آؤٹ عمل درج کریں ۔ آپ کوکی کو حذف کر سکتے ہیں اور اسے ہٹپکونٹی. ساگنووتصینک طریقہ کال کر کے ایک غیر لاگ ان حالت میں واپس لے سکتا ہے ۔

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

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

ایک منظر بنائیں (لاگ ان فارم) (/Views/Account/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>

ایک لاگ آؤٹ لنک بنائیں (/Views/Shared/_Layout. cshtml)

ہوم اسکرین کچھ بھی تبدیل نہیں کرے گا ، لیکن آپ کو نیویگیشن بار میں ایک لاگ آؤٹ لنک پڑے گا. اس کے علاوہ, میں نے بھی جانچ کے مقاصد کے لئے لاگ ان کے بغیر لاگ ان کی سکرین پر ٹرانزیشن کہ ایک لنک ڈال دیں گے.

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

چیک آپریشن

آپ نے کوکی توثیق کے لیے درکار کم ازکم عمل کاری مکمل کی ہے ۔ ایسا کرنے کی کوشش کریں اور دیکھیں کہ یہ کیسے کام کرتا ہے. یہ رویہ تبدیل کرنا چاہئے کہ آیا آپ لاگ ان ہیں یا نہیں ۔ ایک سادہ مثال کے طور پر ، مجھے لگتا ہے کہ آپ مندرجہ ذیل رویے کو دیکھ سکتے ہیں.

آپریشن آپریشن کے نتائج
لاگ ان کے بغیر گھر جانا لاگ ان کی سکرین پر ری ڈائریکٹ
لاگ ان جائیں بطرف گھر سکرین
گھر سے باہر لاگ ان کریں اور لاگ ان کے بغیر گھر جانا لاگ ان کی سکرین پر ری ڈائریکٹ
گھر سے لاگ ان کریں اور لاگ ان کے بغیر گھر جانے نہیں جائیں بطرف گھر سکرین