قم بإنشاء آلية لإعادة توجيهها إذا لم تقم بتسجيل الدخول باستخدام مصادقة ملفات تعريف الارتباط (ASP.NET Core 3.0)

تحديث الصفحة :
تاريخ إنشاء الصفحة :

البيئه

استوديو البصرية
  • مجتمع الاستوديو المرئي 2019
ASP.NET الأساسية
3.0 أو أحدث

يمكن استخدام مصادقة ملفات تعريف الارتباط في .NET Core 2.2 أو قبل ذلك ، ولكن نصائحنا تتضمن رمزًا خصيصًا لـ .NET Core 3.0 والإصدارات الأحدث.

في البداية

ASP.NET Core يستخدم مصادقة ملفات تعريف الارتباط كآلية مصادقة تسجيل الدخول. يمكنك التفكير في مصادقة ملفات تعريف الارتباط كشيء مشابه لمصادقة النماذج التقليدية.

طريقة أخرى للمصادقة ASP.NET الأساسية هي ASP.NET الهوية الأساسية. بالإضافة إلى المصادقة باستخدام النماذج ومصادقة api وخدمات تسجيل الدخول الخارجية وإدارة كلمة المرور وإعادة التعيين وما إلى ذلك. يمكنك استخدام الكثير من الوظائف. ومع ذلك ، من وجهة نظر مجرد جعل شاشة تسجيل الدخول بسيطة هذه المرة ، فإنه يصبح آلية للمصادقة مبالغ فيها قليلا أنا لا استخدامه في هذا الوقت.

في نصائح لمصادقة ملفات تعريف الارتباط، لا يمكنك عرض أي شيء آخر غير شاشة تسجيل الدخول إلا إذا قمت بتسجيل الدخول. إذا حاولت الانتقال إلى شاشة مختلفة، ستتم إعادة توجيهك إلى شاشة تسجيل الدخول. يمكنك أيضًا رؤية شاشات أخرى عن طريق تسجيل الدخول.

بمجرد إدخال اسم المستخدم وكلمة المرور على شاشة تسجيل الدخول، يمكنك تسجيل الدخول. يتم تنفيذ مصادقة المستخدم نفسه في موضع مؤقت. نظرًا لأن التنفيذ الرئيسي لمصادقة ملفات تعريف الارتباط هو الأخير هذه المرة ، فإن عملية الحكم ، مثل ما إذا كانت كلمة المرور صحيحة ، ليست ضرورية.

تسرد هذه النصائح البرنامج بشكل جزئي. تحميل البرنامج الكامل للرمز الكامل.

إنشاء مشروع

بدء Visual Studio وإنشاء مشروع جديد.

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;

يمكنك تمكين مصادقة ملفات تعريف الارتباط عن طريق تشغيل أساليب AddAuthentication و AddCookie. حدد CookieAuthenticationDefaults.AuthenticationScheme إذا لم تكن بحاجة إلى تغيير اسم النظام على وجه الخصوص.

خيارات أسلوب التخويل. إذا قمت بتحديد RequireAuthenticatedUser في سياسة احتياطية، يمكن أن يكون لدى كافة وحدات التحكم نهج مطلوب مصادقة مطبقة على الإجراء. ومن المفيد أيضاً بمعنى أن يتم تقليل التعليمات البرمجية ويتم منع خطأ الوصف إذا كانت المصادقة مطلوبة بخلاف شاشة تسجيل الدخول. ستقوم شاشة تسجيل الدخول فقط بكتابة التعليمات البرمجية التي لا تتطلب مصادقة بشكل فردي.

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

إضافة مصادقة إلى التطبيق الخاص بك. إضافة UseAuthentication(). يستند موقع الوصف إلى وثائق 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 مستقلة عن مصادقة ملف تعريف الارتباط كموقع آخر غير شاشة تسجيل الدخول. ويمكن أيضا ً استخدامه على وحدات تحكم 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 بإنشاء ملف تعريف ارتباط ومصادقة عليه.

إذا كانت هناك حاجة إلى مطالبات إضافية أو انتهت صلاحية ملفات تعريف الارتباط، فأضف معلمات.

بعد تسجيل الدخول، قمنا بإعادة توجيهنا إلى ~/الصفحة الرئيسية/الفهرس، الأمر الذي يتطلب المصادقة.

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

أدخل عملية تسجيل الخروج. يمكنك حذف ملف تعريف ارتباط وإعادته إلى حالة لم يتم تسجيلها عن طريق الاتصال بطريقة HttpContext.SignOutAsync.

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

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

إنشاء طريقة عرض (نموذج تسجيل الدخول) (/طرق العرض/الحساب/Login.cshtml)

نظرًا لأننا لا نأخذها في الاعتبار ، قم بإضافة حقل لإدخال اسم المستخدم وكلمة المرور ، كما هو موضح في الشكل أدناه ، ووضع زر لتسجيل الدخول. يجب عليك أيضًا وضع ارتباط للوصول إلى Home/Index دون تسجيل الدخول لأغراض الاختبار.

لأنه من المزعج إدخال اسم المستخدم وكلمة المرور، يتم تعيين القيمة الأولية.

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)

لن تغير الشاشة الرئيسية أي شيء، ولكن سيكون لديك رابط تسجيل الخروج في شريط التنقل. وبالإضافة إلى ذلك ، سوف أضع أيضا وصلة أن ينتقل إلى شاشة تسجيل الدخول دون تسجيل الخروج لأغراض الاختبار.

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

التحقق من العملية

لقد أكملت الآن الحد الأدنى من التنفيذ المطلوب لمصادقة ملفات تعريف الارتباط. حاول أن تفعل ذلك ونرى كيف يعمل. يجب تغيير السلوك اعتماداً على ما إذا كنت قد قمت بتسجيل الدخول أم لا. كمثال بسيط ، وأعتقد أنه يمكنك أن ترى السلوك التالي.

عملية نتائج العملية
العودة إلى المنزل دون تسجيل الدخول إعادة التوجيه إلى شاشة تسجيل الدخول
تسجيل الدخول الانتقال إلى الشاشة الرئيسية
تسجيل الخروج من المنزل والعودة إلى ديارهم دون تسجيل الدخول إعادة التوجيه إلى شاشة تسجيل الدخول
لا تسجل الخروج من المنزل والعودة إلى المنزل دون تسجيل الدخول الانتقال إلى الشاشة الرئيسية