Vytvorte mechanizmus, ktorý bude presmerovaný, ak sa neprihlásite pomocou autentifikácie súborov cookie (ASP.NET Core 3.0)
Životné prostredie
- Visual Studio
-
- Visual Studio spoločenstva 2019
- ASP.NET Core
- 3,0 alebo novší
Overenie súborov cookie možno použiť v .NET Core 2,2 alebo staršej, ale naše tipy zahŕňajú kód špeciálne pre .NET Core 3,0 a novší.
Ubytovacom zariadení First
ASP.NET Core používa overovanie súborov cookie ako mechanizmus autentifikácie prihlásenia. Môžete si myslieť, cookie autentifikácie ako niečo podobné tradičné formuláre autentifikácie.
Ďalším spôsobom, ako overiť ASP.NET Core je ASP.NET Core identity. Okrem autentifikácie pomocou formulárov, API autentifikácie, externé prihlasovacie služby, správu hesiel a reset, atď. Môžete použiť veľa funkcií. Avšak, z hľadiska len robiť jednoduchú prihlasovaciu obrazovku tentoraz sa stáva mechanizmom trochu prehnané autentifikáciu Nechcem používať v tejto dobe.
V tipy na overenie súborov cookie, nemôžete zobraziť nič iné ako prihlasovacej obrazovke, ak sa prihlásite. Ak sa pokúsite prejsť na inú obrazovku, budete presmerovaní na prihlasovaciu obrazovku. Môžete tiež vidieť ďalšie obrazovky prihlásením.
Po zadaní mena používateľa a hesla na prihlasovacej obrazovke sa môžete prihlásiť. Overenie samotného používateľa sa vykonáva v dočasnom postavení. Vzhľadom k tomu, že hlavné implementácia cookie autentifikácie je posledný tentoraz, rozsudok proces, ako je to, či heslo je správne, nie je podstatné.
Toto tipy uvádza program spartly. Stiahnite si kompletný program pre celý kód.
Vytvorenie projektu
Spustite Visual Studio a vytvoriť nový projekt.
Vyberte položku ASP.net Core Web Application.
Zadajte názov projektu a umiestnenie projektu.
Tentoraz budeme používať MVC projekty, ale väčšina ostatných šablón môžu byť nahradené.
Ak chcete overovanie, vyberte možnosť bez overenia. Ak zvolíte iné overovanie, budete používať ASP.NET Core identity.
Po vytvorení projektu a ladenie, zobrazí sa obrazovka na obrázku nižšie. Vytvoríme program založený na tejto obrazovke.
Upraviť Startup.cs
Startup.cs pridať definície potrebné pre overenie súborov cookie. Namespaces použitie:
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;
Overenie súborov cookie môžete povoliť spustením AddAuthentication a AddCookie metódy. Zadajte CookieAuthenticationDefaults. AuthenticationScheme, ak nie je potrebné zmeniť názov schémy, najmä.
Možnosti addauthorization metódy. Ak zadáte RequireAuthenticatedUser v FallbackPolicy, Všetky radiče môžu mať politiku potrebnú na overenie, ktorá sa aplikuje na akciu. To je tiež užitočné v tom zmysle, že kód je znížená a popis chyba je zabránené, ak overovanie je potrebné iné ako prihlasovacej obrazovke. Iba prihlasovacej obrazovke bude písať kód, ktorý nevyžaduje autentifikáciu jednotlivo.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
// Cookie による認証スキームを追加する
services
.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie();
services.AddAuthorization(options =>
{
// AllowAnonymous 属性が指定されていないすべての Action などに対してユーザー認証が必要となる
options.FallbackPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
});
}
Pridajte autentifikáciu do aplikácie. Pridať UseAuthentication (). Umiestnenie popisu je založené na dokumentácii MSDN. Miesto pred UseAuthorization (). Všetko ostatné zostáva šablóna.
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?}");
});
}
Vytvorenie AccountController
Vytvorte radiče a akcie, ktoré potrebujete na vytvorenie prihlasovacej obrazovky. Názov radiča sa vytvorí ako AccountController. Je to preto, že v predvolenom nastavení, názov radiča a názov akcie prihlasovacej obrazovky sú určené na "~/Account/Login". Ak chcete zmeniť túto cestu, môžete ju zmeniť s možnosťami AddCookie metódy v Startup.cs. Budeme prechádzať s predvolenými nastaveniami.
Prvým krokom je vytvorenie radiča strane. Udelením Allowanonymous atribút, všetky akcie v ňom možno vykonať aj v prípade, že nie sú overené. To umožňuje iba prihlasovacej obrazovke, ktoré majú byť prístupné bez overenia.
Atribút Allowanonymous je nezávislý od overenia súborov cookie ako iného umiestnenia ako prihlasovacej obrazovky. Môže sa použiť aj na radičoch iba 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
{
}
}
Definujte používateľov a heslá, ktoré je možné prihlásiť. Pôvodne som ju uložiť do databázy, ale tentoraz užívateľ rozsudok nie je hlavným zameraním Robím to dočasný súbor.
<summary>仮のユーザーデータベースとする。</summary>
private Dictionary<string, string> UserAccounts { get; set; }
public AccountController()
{
// 仮のユーザーを登録する
UserAccounts = new Dictionary<string, string>
{
{ "user1", "password1" },
{ "user2", "password2" },
};
}
Toto je akcia na zobrazenie prihlasovacej obrazovky. Vráti zobrazenie tak, ako je to spôsobené iba zobrazením.
<summary>ログイン画面を表示します。</summary>
public IActionResult Login()
{
return View();
}
Proces overenia po stlačení tlačidla prihlásenia. Ak sa meno používateľa a heslo zhodujú, môže byť overený.
Nasledujúci kód definuje nárok, totožnosť a Pricinpal ako minimálny kód potrebný na overenie. Volanie HttpContext. SignInAsync metóda generuje cookie a overuje ju.
Ak sa požadujú ďalšie nároky alebo uplynie platnosť súborov cookie, pridajte parametre.
Po prihlásení sme presmerovaní na stránku ~/Home/Index, ktorá vyžaduje autentifikáciu.
<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");
}
Zadajte proces odhlásenia. Súbor cookie môžete odstrániť a vrátiť ho do neprihláseného stavu volaním metódy HttpContext. SignOutAsync.
<summary>ログアウト処理を実行します。</summary>
public async Task<IActionResult> Logout()
{
// 認証クッキーをレスポンスから削除
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
// ログイン画面にリダイレクト
return RedirectToAction(nameof(Login));
}
Vytvorenie zobrazenia (prihlasovací formulár) (/Views/Account/Login.cshtml)
Vzhľadom k tomu, že nebudeme brať do úvahy, pridajte pole zadať svoje užívateľské meno a heslo, ako je znázornené na obrázku nižšie, a miesto tlačidlo pre prihlásenie. Mali by ste tiež umiestniť odkaz na prístup domov/index bez prihlásenia na testovacie účely.
Pretože je problematické zadať meno používateľa a heslo, počiatočná hodnota je nastavená.
@{
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>
Vytvoriť prepojenie odhlásenia (/Views/Shared/_Layout. cshtml)
Domovská obrazovka sa nič nezmení, ale v navigačnom paneli budete mať odkaz na odhlásenie. Okrem toho budem tiež dať odkaz, ktorý prechody na prihlasovacej obrazovke bez odhlásenia na testovacie účely.
<!-- 中略 -->
<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>
<!-- 中略 -->
Kontrola prevádzky
Teraz ste dokončili minimálnu implementáciu potrebnú na overenie súborov cookie. Skúste to urobiť a uvidíte, ako to funguje. To by malo zmeniť správanie v závislosti na tom, či ste prihlásený alebo nie. Ako jednoduchý príklad, myslím, že môžete vidieť nasledujúce správanie.
Operácia | ⇒ | výsledky operácie |
---|---|---|
Prejsť domov bez prihlásenia | ⇒ | Presmerovanie na prihlasovacej obrazovke |
Prihlásiť | ⇒ | Prejsť na domovskú obrazovku |
Odhlásiť sa z domova a ísť domov bez prihlásenia | ⇒ | Presmerovanie na prihlasovacej obrazovke |
Nenechajte sa odhlásiť z domova a ísť domov bez prihlásenia | ⇒ | Prejsť na domovskú obrazovku |