Tanımlama bilgisi kimlik doğrulaması kullanarak oturum açmazsanız yeniden yönlendirilecek bir mekanizma oluşturma (ASP.NET Core 3.0)

Sayfa güncel :
Sayfa oluşturma tarihi :

Ortam

Görsel Stüdyo
  • Visual Studio Topluluğu 2019
ASP.NET Çekirdek
3.0 veya sonrası

Çerez kimlik doğrulaması .NET Core 2.2 veya daha önce kullanılabilir, ancak ipuçlarımız özellikle .NET Core 3.0 ve sonrası için kod içerir.

İlk başta

ASP.NET Core, oturum açma kimlik doğrulama mekanizması olarak çerez kimlik doğrulamasını kullanır. Çerez kimlik doğrulamasını geleneksel formların kimlik doğrulamasına benzer bir şey olarak düşünebilirsiniz.

Core ASP.NET doğrulamanın bir diğer yolu da ASP.NET Çekirdek Kimliktir. Formları kullanarak kimlik doğrulama, api kimlik doğrulama, harici oturum açma hizmetleri, parola yönetimi ve sıfırlama, vb ek olarak Birçok işlev kullanabilirsiniz. Ancak, sadece basit bir giriş ekranı bu kez yapma bakış açısından, biraz abartılı kimlik doğrulama bir mekanizma haline gelir Şu anda kullanmıyorum.

Çerez kimlik doğrulaması için ipuçlarında, oturum açmadığınız sürece oturum açma ekranından başka bir şey görüntülayamazsınız. Farklı bir ekrana gitmeye çalışırsanız, giriş ekranına yönlendirilirsiniz. Oturum açarak diğer ekranları da görebilirsiniz.

Oturum açma ekranına kullanıcı adınızı ve şifrenizi girdikten sonra giriş yapabilirsiniz. Kullanıcının kimlik doğrulaması geçici bir konumda uygulanır. Çerez kimlik doğrulaması ana uygulama son bu kez olduğundan, parola doğru olup olmadığı gibi karar süreci, gerekli değildir.

Bu İpuçları, programı kısmen listeler. Kodun tamamı için programın tamamını indirin.

Proje oluşturma

Visual Studio'yı başlatın ve yeni bir proje oluşturun.

image

Core Web ApplicationASP.NET seçin.

image

Herhangi bir proje adını ve proje konumunu belirtin.

image

Bu sefer mvc projelerini kullanacağız, ancak diğer şablonların çoğu değiştirilebilir.

Kimlik doğrulama için kimlik doğrulama yok'u seçin. Başka bir kimlik doğrulaması seçerseniz, ASP.NET Temel Kimlik'i kullanırsınız.

image

Bir proje oluşturup hata ayıklamadan sonra aşağıdaki şekildeki ekran görüntülenir. Bu ekrana dayalı bir program oluşturacağız.

image

Startup.cs'yı edin

Startup.cs çerez kimlik doğrulaması için gerekli tanımları ekleyin. Ad alanları kullanımı:

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 ve AddCookie yöntemlerini çalıştırarak çerez kimlik doğrulamasını etkinleştirebilirsiniz. Özellikle şema adını değiştirmeniz gerekmiyorsa CookieAuthenticationDefaults.AuthenticationScheme'i belirtin.

Yetkilendirme yöntemi seçenekleri. FallbackPolicy'de RequireAuthenticatedUser'ı belirtirseniz, Tüm denetleyicilerin eyleme kimlik doğrulama için gerekli bir ilkesi uygulanabilir. Ayrıca, kodun küçültülmesi ve giriş ekranı dışında kimlik doğrulamayapılması gerekiyorsa açıklama hatasının engellenmesi anlamında da yararlıdır. Yalnızca giriş ekranı, kimlik doğrulaması gerektirmeyen kodu tek tek yazar.

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

Uygulamanıza kimlik doğrulama ekleyin. UseAuthentication ekle(). Açıklama konumu MSDN belgelerine dayanır. UseAuthorization() önüne yerleştirin. Diğer her şey bir şablon olarak kalır.

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

Hesap Kontrolörü Oluşturma

Bir giriş ekranı oluşturmak için gereken denetleyicileri ve eylemleri oluşturun. Denetleyici adı AccountController olarak oluşturulur. Bunun nedeni varsayılan olarak, giriş ekranının denetleyici adı ve eylem adının "~/Hesap/Giriş" olarak belirlenmesidir. Bu yolu değiştirmek istiyorsanız, Startup.cs'daki AddCookie yöntemiseçenekleriyle değiştirebilirsiniz. Varsayılan ayarları ile devam edeceğiz.

image

İlk adım denetleyici tarafı oluşturmaktır. AllowAnonymous özniteliğini vererek, kimlik doğrulaması yapılsa bile tüm eylemler gerçekleştirilebilir. Bu, yalnızca giriş ekranına kimlik doğrulama olmadan erişilebilmeolanağı sağlar.

AllowAnonymous özniteliği, giriş ekranı dışında bir konum olarak çerez kimlik doğrulamabağımsızdır. Yalnızca api denetleyicilerinde de kullanılabilir.

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

Oturum açmış olabilecek kullanıcıları ve parolaları tanımlayın. Başlangıçta i bir veritabanına kaydetmek, ama bu kez kullanıcı yargı ana odak değil Geçici bir setle yaparım.

/// <summary>仮のユーザーデータベースとする。</summary>
private Dictionary<string, string> UserAccounts { get; set; }

public AccountController()
{
  // 仮のユーザーを登録する
  UserAccounts = new Dictionary<string, string>
  {
    { "user1", "password1" },
    { "user2", "password2" },
  };
}

Bu, giriş ekranını görüntülemek için yapılan bir eylemdir. Görünümü olduğu gibi döndürün, çünkü yalnızca görüntüleniyor.

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

Giriş düğmesine bastıktan sonra kimlik doğrulama işlemi. Kullanıcı adı ve parola eşleşirse, kimlik doğrulaması yapılabilir.

Aşağıdaki kod, kimlik doğrulaması için gereken minimum kod olarak iddia, kimlik ve Pricinpal'i tanımlar. HttpContext.SignInAsync yöntemini aramak bir çerez oluşturur ve doğruluğunu doğrular.

Ek talepler gerekiyorsa veya tanımlama bilgilerinin süresi doluyorsa, parametreler ekleyin.

Oturum açtıktan sonra, kimlik doğrulaması gerektiren ~/Home/Index'e yönlendirdik.

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

Oturum açma işlemini girin. Bir çerezi silebilir ve HttpContext.SignOutAsync yöntemini arayarak günlüğe kaydedilmemiş bir duruma döndürebilirsiniz.

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

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

Görünüm oluşturma (giriş formu) (/Görünümler/Hesap/Login.cshtml)

Dikkate almadığımız için, aşağıdaki şekilde gösterildiği gibi kullanıcı adınızı ve parolanızı girmek için bir alan ekleyin ve oturum açmak için bir düğme yerleştirin. Ayrıca, test amacıyla oturum açmadan Giriş/Dizin'e erişmek için bir bağlantı yerleştirmelisiniz.

Kullanıcı adı ve parolayı girmek zahmetli olduğundan, ilk değer ayarlanır.

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>

Oturum açma bağlantısı oluşturma (/Görünümler/Paylaşılan/_Layout.cshtml)

Ana ekran hiçbir şeyi değiştirmez, ancak gezinti çubuğunda bir oturum açma bağlantınız olur. Buna ek olarak, ben de test amaçlı oturum açmadan giriş ekranına geçişleri bir bağlantı koyacağız.

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

İşlemi kontrol et

Çerez kimlik doğrulaması için gereken minimum uygulamayı tamamladınız. Bunu yapmaya çalışın ve nasıl çalıştığını görmek. Oturum açıp açmadığınıza bağlı olarak davranışı değiştirmeniz gerekir. Basit bir örnek olarak, ben aşağıdaki davranışı görebilirsiniz düşünüyorum.

Operasyon Operasyon Sonuçları
Giriş yapmadan eve gidin Giriş ekranına yönlendirme
Oturum açma Ana Ekrana Git
Evden çıkış yapın ve giriş yapmadan evinize gidin Giriş ekranına yönlendirme
Evden çıkış yapmayın ve giriş yapmadan eve gidin Ana Ekrana Git