यदि आप कुकी प्रमाणीकरण (ASP.NET कोर 3.0) का उपयोग करके लॉग इन नहीं करते हैं, तो पुनर्निर्देशित होने के लिए एक तंत्र बनाएँ

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

वातावरण

विजुअल स्टूडियो
  • विजुअल स्टूडियो समुदाय 2019
ASP.NET कोर
3.0 या बाद में

कुकी प्रमाणीकरण का उपयोग .NET कोर 2.2 या उससे पहले में किया जा सकता है, लेकिन हमारे सुझावों में विशेष रूप से .NET कोर 3.0 और बाद में कोड शामिल है।

पहले

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

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

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

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

यह टिप्स कार्यक्रम को कुशलता से सूचीबद्ध करता है। पूरा कोड के लिए पूरा कार्यक्रम डाउनलोड करें।

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

विजुअल स्टूडियो शुरू करें और एक नई परियोजना बनाएं।

image

ASP.NET कोर वेब एप्लीकेशन का चयन करें।

image

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

image

इस बार, हम एमवीसी परियोजनाओं का उपयोग करेंगे, लेकिन अधिकांश अन्य टेम्पलेट्स को प्रतिस्थापित किया जा सकता है।

प्रमाणीकरण के लिए, कोई प्रमाणीकरण का चयन करें। यदि आप अन्य प्रमाणीकरण चुनते हैं, तो आप 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();
  });
}

अपने आवेदन में प्रमाणीकरण जोड़ें। UseAuthentication जोड़ें () विवरण स्थान एमएसडीएन दस्तावेज पर आधारित है। 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?}");
  });
}

अकाउंटकंट्रोलर बनाना

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

image

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

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

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();
}

लॉगिन बटन दबाने के बाद प्रमाणीकरण प्रक्रिया। अगर यूजर नेम और पासवर्ड मैच करते हैं तो इसे प्रमाणित किया जा सकता है।

निम्नलिखित कोड प्रमाणीकरण के लिए आवश्यक न्यूनतम कोड के रूप में दावा, पहचान और प्रिसिंपल को परिभाषित करता है। 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) बनाएं

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

क्योंकि यूजर नेम और पासवर्ड डालना परेशानी का सबब है, इसलिए शुरुआती वैल्यू तय है।

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

ऑपरेशन की जांच करें

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

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