Ustvarite mehanizem za preusmeritev, če se ne prijavite s preverjanjem pristnosti piškotkov (ASP.NET Core 3.0)
Okolje
- Vizualni Studio
-
- Visual Studio Skupnosti 2019
- ASP.NET jedro
- 3,0 ali novejši
Preverjanje pristnosti piškotkov se lahko uporablja v .NET Core 2,2 ali starejših, vendar naši namigi vsebujejo kodo, posebej za .NET Core 3,0 in novejše.
Sprva
ASP.NET Core uporablja preverjanje pristnosti piškotkov kot mehanizem za prijavo pristnosti . Preverjanje pristnosti piškotkov si lahko ogledate kot nekaj podobnega za običajne avtentikacije obrazcev.
Drug način za avtentikacijo ASP.NET Core je ASP.NET Core Identity. Poleg avtentikacije z obrazci, API avtentikacijo, zunanje storitve za prijavo, upravljanje z geslom in reset, itd Uporabite lahko veliko funkcij. Vendar pa z vidika samo kar preprost prijavni zaslon tokrat, postane mehanizem malo pretiranega avtentikacije Ne uporabljam je v tem trenutku.
Pri nasvetih za preverjanje pristnosti piškotkov ne morete prikazati ničesar drugega kot prijavni zaslon, razen če se prijavite. Če poskušate iti na drug zaslon, boste preusmerjeni na prijavni zaslon. Druge zaslone si lahko ogledate tudi tako, da se prijavite.
Ko vnesete uporabniško ime in geslo na prijavni zaslon, se lahko prijavite. Avtentikacija samega uporabnika se izvaja v začasnem položaju. Ker je glavno izvajanje avtentikacije piškotkov zadnje tokrat, postopek presoje, na primer, ali je geslo pravilno, ni nujen.
Ta Nasveti seznam program spartly. Prenesite celoten program za celotno kodo.
Ustvarjanje projekta
Zaženite Visual Studio in ustvarite nov projekt.
izberite ASP.net Core Web Application.
Navedite ime projekta in lokacijo projekta.
Tokrat bomo uporabili MVC projekte, vendar je večina drugih predlog mogoče nadomestiti.
Za preverjanje pristnosti Izberite brez preverjanja pristnosti. Če izberete drugo preverjanje pristnosti, boste uporabili ASP.NET Core Identity.
Ko ustvarite projekt in ga razhroščujete, se prikaže zaslon na spodnji sliki. Ustvarili bomo program, ki temelji na tem zaslonu.
Uredi Startup.cs
Startup.cs dodati definicije, potrebne za preverjanje pristnosti piškotkov. Imenski prostori uporabljajo:
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;
Preverjanje pristnosti piškotkov lahko omogočite tako, da zaženete metode AddAuthentication in AddCookie. Določite program CookieAuthenticationDefaults. AuthenticationScheme, če vam ni treba spremeniti imena sheme posebej.
Možnosti addauthorization metode. Če navedete RequireAuthenticatedUser v FallbackPolicy, Vsi krmilniki imajo lahko potrebno preverjanje pristnosti, ki se uporablja za dejanje. Prav tako je koristno v smislu, da je koda zmanjšana in opis napaka je preprečena, če je potrebno preverjanje pristnosti, razen prijavni zaslon. Samo prijavni zaslon bo napisal kodo, ki ne zahteva avtentikacije posamično.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
// Cookie による認証スキームを追加する
services
.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie();
services.AddAuthorization(options =>
{
// AllowAnonymous 属性が指定されていないすべての Action などに対してユーザー認証が必要となる
options.FallbackPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
});
}
V aplikacijo dodajte preverjanje pristnosti . Dodajanje preverjanja pristnosti (). Opis lokacija temelji na dokumentaciji MSDN. Mesto pred UseAuthorization (). Vse ostalo je še vedno predloga.
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?}");
});
}
Ustvarjanje AccountController
Ustvarite krmilnike in dejanja, ki jih potrebujete za ustvarjanje prijavnega zaslona. Ime kontrolnika je ustvarjeno kot AccountController. To je zato ker z ne izpolniti obveznosti, ime upravljavca ter dejanje ime od prepričevalnost zaslon ste odločen v obstati "~/Account/login". Če želite spremeniti to pot, jo lahko spremenite z možnostmi AddCookie metode v Startup.cs. Šli bomo skozi privzete nastavitve.
Prvi korak je, da ustvarite krmilnik strani. Z dodelitvijo atributa Allowanonymous se lahko vsa dejanja v njem izvedejo tudi, če niso preverjena. To omogoča dostop do uporabniškega zaslona brez preverjanja pristnosti.
Atribut Allowanonymous je neodvisen od avtentikacije piškotkov kot mesto, ki ni prijavni zaslon. Uporablja se lahko tudi na krmilnikih, ki so samo 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
{
}
}
Definirajte uporabnike in gesla, ki jih je mogoče prijaviti. Uvodoma jaz zaščititi to v a časovno določljiv, šele to čas uporabnik sodna odločba ni najvažnejši žarišče To sem naredila z začasnim zakom.
<summary>仮のユーザーデータベースとする。</summary>
private Dictionary<string, string> UserAccounts { get; set; }
public AccountController()
{
// 仮のユーザーを登録する
UserAccounts = new Dictionary<string, string>
{
{ "user1", "password1" },
{ "user2", "password2" },
};
}
To je dejanje za prikaz prijavnega zaslona. Vrnite pogled, ker je prikazan samo.
<summary>ログイン画面を表示します。</summary>
public IActionResult Login()
{
return View();
}
Postopek preverjanja pristnosti po pritisku na gumb za prijavo. Če se uporabniško ime in geslo ujemata, se lahko overi.
Naslednja koda definira zahtevek, identiteto in Pricinpal kot minimalno kodo, potrebno za preverjanje pristnosti. Klicanje metode HttpContext. SignInAsync ustvari piškotek in ga potrdi.
Če so zahtevani dodatni zahtevki ali pa piškotki potečejo, dodajte parametre.
Po prijavi, smo preusmerjeni na ~/Home/Index, ki zahteva avtentikacijo.
<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");
}
Vnesite postopek logout. Piškotek lahko izbrišete in ga vrnete v neprijavljen stanje tako, da pokličete metodo HttpContext. SignOutAsync.
<summary>ログアウト処理を実行します。</summary>
public async Task<IActionResult> Logout()
{
// 認証クッキーをレスポンスから削除
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
// ログイン画面にリダイレクト
return RedirectToAction(nameof(Login));
}
Ustvarjanje pogleda (prijavni obrazec) (/Views/Account/Login.cshtml)
Ker ga ne upoštevamo, dodajte polje za vnos uporabniškega imena in gesla, kot je prikazano na spodnji sliki, in postavite gumb za prijavo. Vi should tudi mesto a člen v postranski dom/indeks če ne drvarsko delo zakaj preskušnja namen.
Ker je težavno vnesti uporabniško ime in geslo, je nastavljena začetna vrednost.
@{
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>
Ustvarjanje logout povezave (/Views/Shared/_Layout. cshtml)
Domači zaslon ne bo ničesar spremenil, vendar boste v vrstici za krmarjenje imeli povezavo za odjavo. Poleg tega bom tudi dal link, ki prehode na prijavni zaslon, ne da bi odjavili za namene testiranja.
<!-- 中略 -->
<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>
<!-- 中略 -->
Preverite delovanje
Zdaj ste zaključili minimalno izvajanje, potrebno za preverjanje pristnosti piškotkov. Poskusite to storiti in videli, kako deluje. To bi moralo spremeniti obnašanje glede na to, ali ste prijavljeni ali ne. Kot preprost primer, mislim, da lahko vidite naslednje obnašanje.
Operacija | ⇒ | Rezultati operacije |
---|---|---|
Pojdi domov, ne da bi se prijavili v | ⇒ | Preusmeritev na prijavni zaslon |
Prijavo | ⇒ | Pojdi na začetni zaslon |
Odjavite se iz doma in pojdite domov, ne da bi se prijavili v | ⇒ | Preusmeritev na prijavni zaslon |
Ne Odjavite se iz doma in pojdite domov, ne da bi se prijavili v | ⇒ | Pojdi na začetni zaslon |