Luo mekanismi, joka ohjataan uudelleen, jos et kirjaudu sisään evästetodennuksella (ASP.NET Core 3.0)

Sivu päivitetty :
Sivun luontipäivämäärä :

Ympäristö

Visuaalinen studio
  • Visual Studio -yhteisö 2019
ASP.NET Core
3.0 tai uudempi

Evästeiden todennusta voidaan käyttää .NET Core 2.2:ssa tai sitä aiemmissa versioissa, mutta vinkeissämme on koodi erityisesti .NET Core 3.0:aa ja uudempaa varten.

Aluksi

ASP.NET Core käyttää evästetodennusta sisäänkirjautumisen todennusmekanismina. Voit ajatella evästeiden todennusta perinteisen lomakkeiden todennuksen kaltaisena.

Toinen tapa todentaa ASP.NET Core on ASP.NET Core Identity. Lisäksi todennuksen avulla lomakkeet, api-todennus, ulkoiset kirjautumispalvelut, salasanojen hallinta ja nollaus jne. Voit käyttää paljon toimintoja. Kuitenkin näkökulmasta vain tehdä yksinkertainen kirjautumisnäyttö tällä kertaa, se tulee mekanismi hieman liioiteltu todennus En käytä sitä tällä hetkellä.

Kun vinkkejä evästeen todennus, et voi näyttää mitään muuta kuin kirjautumisnäyttö ellet kirjaudu sisään. Jos yrität siirtyä toiseen näyttöön, sinut ohjataan kirjautumisnäyttöön. Voit myös nähdä muita näyttöjä kirjautumalla sisään.

Kun olet kirjoittanyt käyttäjätunnuksesi ja salasanasi kirjautumisnäyttöön, voit kirjautua sisään. Käyttäjän todennus toteutetaan väliaikaisessa sijainnissa. Koska evästeiden todennuksen pääasiallinen toteutus on tällä kertaa viimeinen, tuomioprosessi, kuten se, onko salasana oikein, ei ole välttämätön.

Tämä Vinkkejä luetellaan ohjelma sosittain. Lataa koko ohjelma koko koodi.

Projektin luominen

Käynnistä Visual Studio ja luo uusi projekti.

image

valitse ASP.NET Core Web Application.

image

Määritä mikä tahansa projektin nimi ja projektin sijainti.

image

Tällä kertaa käytämme mvc-projekteja, mutta useimmat muut mallit voidaan korvata.

Valitse todennusta varten Ei todennusta. Jos valitset muun todennuksen, käytät ASP.NET Core Identity.

image

Kun olet luonut projektin ja virheennyt, alla olevan kuvan näyttö tulee näkyviin. Luomme ohjelman, joka perustuu tähän näyttöön.

image

Muokkaa Startup.cs

Startup.cs lisätä evästeiden todentamiseen tarvittavat määritykset. Nimitilojen käyttö:

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;

Voit ottaa evästeiden todennuksen käyttöön suorittamalla AddAuthentication- ja AddCookie-menetelmät. Määritä CookieAuthenticationDefaults.AuthenticationScheme, jos sinun ei tarvitse muuttaa mallin nimeä erityisesti.

Addauthorization-menetelmän asetukset. Jos määrität RequireAuthenticatedUser-kohteeksi Kaikkiin ohjaimiin voi olla käytössä todennusedellyttämä käytäntö. Se on myös hyödyllinen siinä mielessä, että koodi on vähennetty ja kuvaus virhe estetään, jos todennus on tarpeen muu kuin kirjautumisnäyttö. Vain kirjautumisnäyttö kirjoittaa koodin, joka ei edellytä todennusta erikseen.

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

Lisää todennus sovellukseesi. Lisää UseAuthentication(). Kuvaussijainti perustuu MSDN-dokumentaatioon. Aseta UseAuthorization()-kohdan eteen. Kaikki muu on edelleen malli.

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

AccountControllerin luominen

Luo ohjaimet ja toiminnot, joita tarvitset kirjautumisnäytön luomiseen. Ohjaimen nimi luodaan AccountController-kohteeksi. Tämä johtuu siitä, että oletusarvoisesti kirjautumisnäytön ohjaimen nimi ja toiminnon nimi on määritetty "~/Account/Login". Jos haluat muuttaa tätä polkua, voit muuttaa sitä Startup.cs AddCookie-menetelmän vaihtoehdoilla. Siirrymme oletusasetuksiin.

image

Ensimmäinen vaihe on ohjaimen puolen luominen. Myöntämällä AllowAnonymous-määritteen kaikki sen toiminnot voidaan suorittaa, vaikka niitä ei todenneta. Tämä mahdollistaa vain kirjautumisnäytön käyttämisen ilman todennusta.

AllowAnonymous-määrite ei ole riippumaton evästetodennuksesta muuna sijaintina kuin kirjautumisnäyttönä. Sitä voidaan käyttää myös api-vain ohjaimissa.

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

Määritä käyttäjät ja salasanat, jotka voidaan kirjata sisään. Alun perin tallennan sen tietokantaan, mutta tällä kertaa käyttäjän tuomio ei ole tärkein painopiste Teen sen väliaikaisella sarjalla.

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

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

Tämä on toiminto, joka näyttää kirjautumisnäytön. Palauta näkymä sellaisenaan, koska se näkyy vain.

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

Todennusprosessi kirjautumispainikkeen painamisen jälkeen. Jos käyttäjänimi ja salasana vastaavat toisiaan, ne voidaan todentaa.

Seuraava koodi määrittää vaatimuksen, henkilöllisyyden ja Pricinpalin todentamiseen tarvittavaksi vähimmäiskoodiksi. HttpContext.SignInAsync-menetelmän kutsuminen luo evästeen ja todentaa sen.

Jos lisävaatimuksia tarvitaan tai evästeet vanhenevat, lisää parametreja.

Sisäänkirjautumisen jälkeen olemme uudelleenohjanneet ~/Home/Index-kohteeseen, joka edellyttää todennusta.

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

Kirjoita uloskirjautumisprosessi. Voit poistaa evästeen ja palauttaa sen kirjaamattomaan tilaan kutsumalla HttpContext.SignOutAsync-menetelmää.

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

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

Näkymän luominen (kirjautumislomake) (/Views/Account/Login.cshtml)

Koska emme ota sitä huomioon, lisää kenttä, jolla voit syöttää käyttäjätunnuksesi ja salasanasi alla olevan kuvan mukaisesti, ja aseta painike sisäänkirjautumista vastaan. Sinun tulisi myös sijoittaa linkki käyttää Home / Index kirjautumatta testausta varten.

Koska on hankalaa kirjoittaa käyttäjänimi ja salasana, alkuarvo asetetaan.

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>

Luo uloskirjautumislinkki (/Views/Shared/_Layout.cshtml)

Aloitusnäyttö ei muuta mitään, mutta siirtymispalkissa on uloskirjautumislinkki. Kotona jatko, Ll' kin arvioida kytkeä että muutos jotta johdonmukaisuus irtoseinä ilman hakkaus rikki ajaksi todistaa aikoa.

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

Tarkista toiminto

Olet nyt suorittanut evästeen todentamiseen tarvittavan vähimmäiskäyttöönoton. Yritä tehdä se ja nähdä, miten se toimii. Sen pitäisi muuttaa toimintaa sen mukaan, oletko kirjautunut sisään vai et. Koska herkkäuskoinen esikuva, i-kirjain ajatella te kanisteri hiippakunta seuraava esiintyminen.

Käyttö Käytön tulokset
Mene kotiin kirjautumatta sisään Ohjaa uudelleen kirjautumisnäyttöön
Kirjaudu Siirry aloitusnäyttöön
Kirjaudu ulos kotoa ja mene kotiin kirjautumatta sisään Ohjaa uudelleen kirjautumisnäyttöön
Älä kirjaudu ulos kotoa ja mene kotiin kirjautumatta sisään Siirry aloitusnäyttöön