Hozzon létre egy mechanizmust, amely átirányítja, ha nem cookie-hitelesítéssel jelentkezik be (ASP.NET Core 3.0)
Környezet
- Vizuális stúdió
-
- Visual Studio Közösség 2019
- ASP.NET Core
- 3.0 vagy újabb
A cookie-hitelesítés használható a .NET Core 2.2-es vagy korábbi verzióiban, de tippjeink kifejezetten a .NET Core 3.0-s és újabb kódokat tartalmazzák.
Először
ASP.NET Core a cookie-hitelesítést használja bejelentkezési hitelesítési mechanizmusként. A cookie-hitelesítést a hagyományos űrlaphitelesítéshez hasonló nak is gondolhatja.
Egy másik módja annak, hogy hitelesítse ASP.NET Core ASP.NET Core Identity. Amellett, hogy a hitelesítés űrlapok, api hitelesítés, külső bejelentkezési szolgáltatások, jelszó kezelés és reset, stb Számos funkciót használhat. Azonban abból a szempontból, hogy csak így egy egyszerű bejelentkezési képernyő ebben az időben, ez lesz a mechanizmus egy kicsit eltúlzott hitelesítés Én nem használja ebben az időben.
A cookie-hitelesítéstippjeiben csak a bejelentkezési képernyőn jeleníthetmeg mást, ha bejelentkezik. Ha megpróbál egy másik képernyőre lépni, akkor átirányítja a bejelentkezési képernyőre. Más képernyőket is megláthat, ha bejelentkezik.
Miután megadta a felhasználónevét és jelszavát a bejelentkezési képernyőn, bejelentkezhet. Maga a felhasználó hitelesítése ideiglenes en van megvalósítva. Mivel a cookie-hitelesítés fő megvalósítása ez úttal tart, az ítélethozatali folyamat, például az, hogy a jelszó helyes-e, nem elengedhetetlen.
Ez a tippek felsorolja a program spartly. Töltse le a teljes programot a teljes kódhoz.
Projekt létrehozása
Indítsa el a Visual Studio alkalmazást, és hozzon létre egy új projektet.
válassza ASP.NET Core webalkalmazás lehetőséget.
Adja meg a projekt nevét és helyét.
Ezúttal mvc projekteket fogunk használni, de a legtöbb más sablon helyettesíthető.
Hitelesítéshez válassza a Nincs hitelesítés lehetőséget. Ha más hitelesítést választ, ASP.NET Core Identity-t fogja használni.
Miután létrehozott egy projektet, és hibakeresést végez, megjelenik az alábbi ábra képernyője. Létrehozunk egy programot ezen a képernyőn.
Startup.cs szerkesztése
Startup.cs adja hozzá a cookie-hitelesítéshez szükséges definíciókat. A névterek a következőket használják:
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;
A cookie-k hitelesítését az AddAuthentication és az AddCookie metódusok futtatásával engedélyezheti. Adja meg a CookieAuthenticationDefaults.AuthenticationScheme értéket, ha nem kell módosítania a séma nevét.
Az addauthorization metódus beállításai. Ha a RequireAuthenticatedUser értéket adja meg a FallbackPolicy alkalmazásban, Minden vezérlő rendelkezhet a művelethez hitelesítéshez szükséges házirendalkalmazásával. Az is hasznos abban az értelemben, hogy a kód csökken, és a leírás hiba megakadályozza, ha a hitelesítés szükséges más, mint a bejelentkezési képernyőn. Csak a bejelentkezési képernyő fogja írni a kódot, amely nem igényel hitelesítést külön-külön.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
// Cookie による認証スキームを追加する
services
.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie();
services.AddAuthorization(options =>
{
// AllowAnonymous 属性が指定されていないすべての Action などに対してユーザー認証が必要となる
options.FallbackPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
});
}
Adja hozzá a hitelesítést az alkalmazáshoz. UseAuthentication() hozzáadása. A leírás helye az MSDN dokumentációján alapul. Helyezze a UseAuthorization() elé. Minden más sablon marad.
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?}");
});
}
AccountController létrehozása
Hozza létre a bejelentkezési képernyő létrehozásához szükséges vezérlőket és műveleteket. A vezérlő név AccountController néven jön létre. Ennek az az oka, hogy alapértelmezés szerint a bejelentkezési képernyő vezérlőneve és műveletneve "~/Account/Login" lesz. Ha meg szeretné változtatni ezt az elérési utat, módosíthatja az AddCookie módszer beállításaival Startup.cs. Végigcsináljuk az alapértelmezett beállításokat.
Az első lépés a vezérlő oldalának létrehozása. Az AllowAnonymous attribútum megadásával az összes művelet akkor is elvégezhető, ha nincsenek hitelesítve. Ez lehetővé teszi, hogy csak a bejelentkezési képernyő hitelesítés nélkül érhető el.
Az AllowAnonymous attribútum független a cookie-hitelesítéstől, mint a bejelentkezési képernyőtől eltérő hely. Csak api-vezérlőkön is használható.
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
{
}
}
Adja meg a bejelentkezhető felhasználókat és jelszavakat. Eredetileg én menteni egy adatbázisba, de ezúttal a felhasználói ítélet nem a fő hangsúly Ideiglenesen megcsinálom.
<summary>仮のユーザーデータベースとする。</summary>
private Dictionary<string, string> UserAccounts { get; set; }
public AccountController()
{
// 仮のユーザーを登録する
UserAccounts = new Dictionary<string, string>
{
{ "user1", "password1" },
{ "user2", "password2" },
};
}
Ez egy művelet a bejelentkezési képernyő megjelenítéséhez. A nézetet úgy adja vissza, ahogy van, mert csak jelenik meg.
<summary>ログイン画面を表示します。</summary>
public IActionResult Login()
{
return View();
}
Hitelesítési folyamat a bejelentkezési gomb megnyomása után. Ha a felhasználónév és a jelszó egyezik, hitelesíthető.
A következő kód határozza meg a jogcím, identitás, és pricinpal, mint a hitelesítéshez szükséges minimális kód. A HttpContext.SignInAsync metódus hívása létrehoz egy cookie-t, és hitelesíti azt.
Ha további jogcímekre van szükség, vagy a cookie-k lejárnak, adjon hozzá paramétereket.
A bejelentkezés után átirányítottuk a ~/Home/Index-et, amely hitelesítést igényel.
<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");
}
Adja meg a kijelentkezési folyamatot. A HttpContext.SignOutAsync metódus meghívásával törölheti a cookie-kat, és visszaküldheti nem naplózott állapotba.
<summary>ログアウト処理を実行します。</summary>
public async Task<IActionResult> Logout()
{
// 認証クッキーをレスポンスから削除
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
// ログイン画面にリダイレクト
return RedirectToAction(nameof(Login));
}
Nézet (bejelentkezési űrlap) létrehozása (/Nézetek/Fiók/Login.cshtml)
Mivel nem vesszük figyelembe, adjon hozzá egy mezőt a felhasználónevének és jelszavának megadásához, ahogy az az alábbi ábrán is látható, és helyezzen el egy gombot a bejelentkezéshez. A Home/Index elérésére mutató hivatkozást is el kell helyeznie anélkül, hogy tesztelési célból bejelentkezne.
Mivel a felhasználónév és a jelszó megadása problémás, a kezdeti érték be van állítva.
@{
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>
Kijelentkezési hivatkozás létrehozása (/Views/Shared/_Layout.cshtml)
A kezdőképernyő nem változtat semmit, de a navigációs sávon lesz egy kijelentkezési hivatkozás. Ráadásul, én' is tesz egy láncszem amit átmeneti -hoz logika képernyő nélkül kijelentkezik részére vizsgálat cél.
<!-- 中略 -->
<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>
<!-- 中略 -->
Ellenőrzés művelete
Most már befejezte a cookie-hitelesítéshez szükséges minimális implementációt. Próbáld meg csinálni, és hogyan működik. Meg kell változtatni a viselkedést attól függően, hogy be van jelentkezve, vagy sem. Mint egy egyszerű példa, azt hiszem, láthatjuk a következő viselkedést.
Művelet | ⇒ | Művelet eredményei |
---|---|---|
Menjen haza bejelentkezés nélkül | ⇒ | Átirányítás a bejelentkezési képernyőre |
Logika | ⇒ | Ugrás a kezdőképernyőre |
Jelentkezzen ki otthonról, és menjen haza bejelentkezés nélkül | ⇒ | Átirányítás a bejelentkezési képernyőre |
Ne jelentkezzen ki otthonról, és ne menjen haza bejelentkezés nélkül | ⇒ | Ugrás a kezdőképernyőre |