Skapa en mekanism som ska omdirigeras om du inte loggar in med cookie-autentisering (ASP.NET Core 3.0)
Miljö
- Visuell studio
-
- Visual Studio-gemenskapen 2019
- ASP.NET kärna
- 3.0 eller senare
Cookie-autentisering kan användas i .NET Core 2.2 eller tidigare, men våra tips innehåller kod specifikt för .NET Core 3.0 och senare.
Först
ASP.NET Core använder cookie-autentisering som en inloggningsautentiseringsmekanism. Du kan se cookie-autentisering som något som liknar traditionell formulärautentisering.
Ett annat sätt att autentisera ASP.NET Core är ASP.NET Core Identity. Förutom autentisering med hjälp av formulär, api-autentisering, externa inloggningstjänster, lösenordshantering och återställning, etc. Du kan använda många funktioner. Men ur synvinkel att bara göra en enkel inloggningsskärm den här gången blir det en mekanism för lite överdriven autentisering Jag använder det inte just nu.
I tipsen för cookie-autentisering kan du inte visa något annat än inloggningsskärmen om du inte loggar in. Om du försöker gå till en annan skärm omdirigeras du till inloggningsskärmen. Du kan också se andra skärmar genom att logga in.
När du har angett ditt användarnamn och lösenord på inloggningsskärmen kan du logga in. Autentiseringen av användaren själv implementeras i en tillfällig position. Eftersom huvudimplementeringen av cookie-autentisering är den sista den här gången är bedömningsprocessen, till exempel om lösenordet är korrekt, inte nödvändig.
I det här tipset visas programmet spartly. Ladda ner hela programmet för den fullständiga koden.
Skapa ett projekt
Starta Visual Studio och skapa ett nytt projekt.
välj ASP.NET Core Web Application.
Ange projektnamn och projektplats.
Den här gången använder vi mvc-projekt, men de flesta andra mallar kan ersättas.
För autentisering väljer du Ingen autentisering. Om du väljer annan autentisering använder du ASP.NET Core Identity.
När du har skapat ett projekt och felsöker det visas skärmen i bilden nedan. Vi kommer att skapa ett program baserat på denna skärm.
Redigera Startup.cs
Startup.cs lägga till de definitioner som krävs för cookie-autentisering. Namnområden använder:
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;
Du kan aktivera cookie-autentisering genom att köra addauthentication- och AddCookie-metoderna. Ange CookieAuthenticationDefaults.AuthenticationScheme om du inte behöver ändra schemanamnet i synnerhet.
Alternativen för addauthorization-metod. Om du anger RequireAuthenticatedUser i FallbackPolicy, Alla styrenheter kan ha en princip som krävs för autentisering som tillämpas på åtgärden. Det är också användbart i den meningen att koden minskas och beskrivningen misstag förhindras om autentisering krävs annat än inloggningsskärmen. Endast inloggningsskärmen skriver koden som inte kräver autentisering individuellt.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
// Cookie による認証スキームを追加する
services
.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie();
services.AddAuthorization(options =>
{
// AllowAnonymous 属性が指定されていないすべての Action などに対してユーザー認証が必要となる
options.FallbackPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
});
}
Lägg till autentisering i ditt program. Lägg till UseAuthentication(). Beskrivningsplatsen baseras på MSDN-dokumentationen. Placera framför UseAuthorization(). Allt annat förblir en mall.
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?}");
});
}
Skapa en accountcontroller
Skapa de styrenheter och åtgärder du behöver för att skapa en inloggningsskärm. Controller-namnet skapas som AccountController. Detta beror på att som standard, controller namn och åtgärd namn på inloggningsskärmen bestäms vara "~ / Konto / Login". Om du vill ändra den här sökvägen kan du ändra den med alternativen för AddCookie-metoden i Startup.cs. Vi går igenom standardinställningarna.
Det första steget är att skapa styrenhetssidan. Genom att bevilja attributet AllowAnonymous kan alla åtgärder i det utföras även om de inte autentiseras. Detta gör att endast inloggningsskärmen kan nås utan autentisering.
Attributet AllowAnonymous är oberoende av cookie-autentisering som en annan plats än inloggningsskärmen. Det kan också användas på api-only controllers.
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
{
}
}
Definiera de användare och lösenord som kan loggas in. Ursprungligen jag spara den till en databas, men den här gången användaren dom är inte huvudfokus Jag klarar mig genom en tillfällig uppsättning.
<summary>仮のユーザーデータベースとする。</summary>
private Dictionary<string, string> UserAccounts { get; set; }
public AccountController()
{
// 仮のユーザーを登録する
UserAccounts = new Dictionary<string, string>
{
{ "user1", "password1" },
{ "user2", "password2" },
};
}
Detta är en åtgärd för att visa inloggningsskärmen. Returnera vyn som den är eftersom den bara visas.
<summary>ログイン画面を表示します。</summary>
public IActionResult Login()
{
return View();
}
Autentiseringsprocessen efter att ha tryckt på inloggningsknappen. Om användarnamnet och lösenordet stämmer överens kan det autentiseras.
Följande kod definierar anspråk, identitet och Pricinpal som den minsta kod som krävs för autentisering. Anropar metoden HttpContext.SignInAsync genererar en cookie och autentiserar den.
Om ytterligare anspråk krävs eller om cookies upphör att gälla lägger du till parametrar.
När vi har loggat in har vi omdirigerat till ~/Home/Index, vilket kräver autentisering.
<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");
}
Ange utloggningsprocessen. Du kan ta bort en cookie och återställa den till ett ologgat tillstånd genom att anropa metoden HttpContext.SignOutAsync.
<summary>ログアウト処理を実行します。</summary>
public async Task<IActionResult> Logout()
{
// 認証クッキーをレスポンスから削除
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
// ログイン画面にリダイレクト
return RedirectToAction(nameof(Login));
}
Skapa en vy (inloggningsformulär) (/Visningar/Konto/Login.cshtml)
Eftersom vi inte tar hänsyn till det lägger du till ett fält för att ange ditt användarnamn och lösenord, som visas i bilden nedan, och placera en knapp för att logga in. Du bör också placera en länk för att komma åt Hem/ Index utan att logga in för testning.
Eftersom det är besvärligt att ange användarnamn och lösenord anges det ursprungliga värdet.
@{
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>
Skapa en utloggningslänk (/Visningar/Delad/_Layout.cshtml)
Startskärmen ändrar ingenting, men du har en utloggningslänk i navigeringsfältet. Dessutom ska jag också lägga en länk som övergår till inloggningsskärmen utan att logga ut för teständamå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>
<!-- 中略 -->
Kontrollera åtgärden
Du har nu slutfört den minsta implementering som krävs för cookie-autentisering. Försök att göra det och se hur det fungerar. Det bör ändra beteendet beroende på om du är inloggad eller inte. Som ett enkelt exempel, jag tror du kan se följande beteende.
Operation | ⇒ | Drift Resultat |
---|---|---|
Gå hem utan att logga in | ⇒ | Omdirigera till inloggningsskärmen |
Logga in | ⇒ | Gå till startskärmen |
Logga ut hem och gå hem utan att logga in | ⇒ | Omdirigera till inloggningsskärmen |
Logga inte ut hemifrån och gå hem utan att logga in | ⇒ | Gå till startskärmen |