Erstellen Sie mehrere Anmeldebildschirme und begrenzen Sie die Seiten, auf die von dem Bildschirm aus zugegriffen werden kann, bei dem Sie angemeldet sind
Betriebsumgebung
- Visual Studio
-
- Visual Studio-Community 2022
- ASP.NET Core (MVC, Razor Pages)
- 6.0
Zuerst
In diesem Abschnitt wird beschrieben, wie Sie mehrere Anmeldebildschirme in einer Anwendung vorbereiten und die Seiten trennen, auf die von jedem Anmeldebildschirm aus zugegriffen werden kann. Die Methode zum Erstellen eines einzelnen Anmeldebildschirms wird unter "Erstellen eines Anmeldemechanismus mithilfe der Cookie-Authentifizierung und Erstellen eines Mechanismus, der umgeleitet wird, wenn Sie nicht authentifiziert sind" erläutert, und dieser Inhalt wird unter der Annahme erläutert, dass Sie über Kenntnisse zum Erstellen eines einzelnen Anmeldebildschirms verfügen. Daher ist der Ablauf eines einzelnen Anmeldebildschirms nur eine einfache Erklärung.
Erstellen eines Projekts
Ich erstelle ein Razor Pages- und MVC-Beispiel, aber es ist in Ordnung, nur das Projekt zu erstellen, das Sie verwenden möchten.
Bearbeiten von Program.cs (Razor Pages, MVC Common)
Dieses Mal werden wir die Methode verwenden, die Seiten, auf die von der Anmeldeseite aus zugegriffen werden kann, durch den Namen "Schema" zu trennen.
Fügen Sie zunächst den Namespace am Anfang des Codes hinzu.
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authorization;
Im Folgenden finden Sie einen Builder. Code, der zu den Diensten hinzugefügt werden soll.
// === 省略 ===
// 「Razor Pages」のコード
// builder.Services.AddRazorPages();
// 「MVC」のコード
// builder.Services.AddControllersWithViews();
// ※ここから追加
// Cookie による認証スキームを追加する
builder.Services
.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie("FirstAuth", option =>
{
option.LoginPath = "/Account/LoginFirst";
})
.AddCookie("SecondAuth", option =>
{
option.LoginPath = "/Account/LoginSecond";
});
builder.Services.AddAuthorization(options =>
{
// 認証属性を設定していない画面は FirstAuth スキーマの認証が必要となる
options.FallbackPolicy = new AuthorizationPolicyBuilder("FirstAuth")
.RequireAuthenticatedUser()
.Build();
});
// ※ここまで追加
var app = builder.Build();
// === 省略 ===
Der Unterschied zum letzten Mal besteht darin, dass Cookies zu zwei hinzugefügt werden.
AddCookie
Das erste Argument enthält jeweils den Schemanamen, der die Anmeldung identifiziert. Dieser Name kann alles sein, solange es sich um einen anderen Namen handelt.
Das zweite Argument ist die URL der Anmeldeseite, die umgeleitet wird, wenn auf eine Anmeldung zugegriffen wird, ohne sich anzumelden.
Übrigens, wenn Sie keinen Schemanamen angeben, ist er CookieAuthenticationDefaults.AuthenticationScheme
identisch mit .
FallbackPolicy
Außerdem wird das Schema als Einstellung für FirstAuth
angegeben. Daher ist der Zugriff auf FirstAuth
diese unberührte Index.cshtml
oder Privacy.cshtml
Schemaauthentifizierung erforderlich.
Der Code für die folgende App ist derselbe wie für eine einzelne Anmeldung.
// === 省略 ===
app.UseRouting();
app.UseAuthentication(); // [追加] 認証
app.UseAuthorization(); // 認可
// 「Razor Pages」のコード
// app.MapRazorPages();
// 「MVC」のコード
// app.MapControllerRoute(
// name: "default",
// pattern: "{controller=Home}/{action=Index}/{id?}");
// === 省略 ===
Programme für Razor Pages-Projekte
Erstellen einer Seite nach dem Einloggen
Erstellen Sie zwei Seiten, nachdem Sie sich angemeldet haben. Da es sich um eine Seite handelt, die nur angezeigt wird, ist es in Ordnung, wenn Sie sie so gestalten, dass Sie sehen können, wo Sie angemeldet sind.
Pages/IndexFirst.cshtml
@page
@model IndexFirstModel
@{
ViewData["Title"] = "First page";
}
<div class="text-center">
<h1 class="display-4">First Page</h1>
</div>
Es ist nichts besonders Wichtiges, aber stellen Sie sicher, dass das Modell, auf das Sie verweisen, mit der IndexFirstModel
von Ihnen erstellten Seite übereinstimmt, z. B. . .
Pages/IndexFirst.cshtml.cs
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace CookieAuthenticationMultipleRazorPages.Pages
{
[Authorize(AuthenticationSchemes = "FirstAuth")]
public class IndexFirstModel : PageModel
{
private readonly ILogger<IndexFirstModel> _logger;
public IndexFirstModel(ILogger<IndexFirstModel> logger)
{
_logger = logger;
}
public void OnGet() { }
}
}
Es gibt keine besondere Behandlung, da es nur angezeigt wird, aber beachten Sie, dass wir als Attribut Authorize
des Klassennamens hinzugefügt haben.
AuthenticationSchemes
Das Argument wird auf den in Program.cs angegebenen Schemanamen festgelegt.
Dadurch wird sichergestellt, dass Sie diese Seite nur anzeigen können, wenn Sie sich mit diesem Schemanamen anmelden. Wenn Sie diese Seite besuchen, ohne sich anzumelden, werden Sie auf die Anmeldeseite weitergeleitet.
Pages/IndexSecond.cshtml
Dies ist die zweite Seite nach dem Login.
@page
@model IndexSecondModel
@{
ViewData["Title"] = "Second page";
}
<div class="text-center">
<h1 class="display-4">Second Page</h1>
</div>
Pages/IndexSecond.cshtml.cs
Beachten Sie, dass der Code im Grunde derselbe ist wie auf der ersten Anmeldeseite, aber der Schemaname ist anders.
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace CookieAuthenticationMultipleRazorPages.Pages
{
[Authorize(AuthenticationSchemes = "SecondAuth")]
public class IndexSecondModel : PageModel
{
private readonly ILogger<IndexSecondModel> _logger;
public IndexSecondModel(ILogger<IndexSecondModel> logger)
{
_logger = logger;
}
public void OnGet() { }
}
}
Erstellen einer Anmeldeseite
Erstellen Sie zwei Anmeldeseiten.
Pages/Account/LoginFirst.cshtml.cs
Hängen Sie das Attribut an, damit Sie darauf zugreifen können, ohne AllowAnonymous
sich anzumelden.
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Security.Claims;
namespace CookieAuthenticationMultipleRazorPages.Pages.Account
{
[AllowAnonymous]
public class LoginFirstModel : PageModel
{
}
}
Erstellen Sie eine Variable und ein Dummy-Benutzerkonto, um die von Ihnen eingegebenen Anmeldeinformationen zu erhalten.
[AllowAnonymous]
public class LoginFirstModel : PageModel
{
<summary>ユーザー名。</summary>
[BindProperty]
[Required]
[DisplayName("ユーザー名")]
public string UserName { get; set; } = "";
<summary>パスワード。</summary>
[BindProperty]
[Required]
[DataType(DataType.Password)]
[DisplayName("パスワード")]
public string Password { get; set; } = "";
<summary>仮のユーザーデータベースとする。</summary>
private Dictionary<string, string> UserAccounts { get; set; } = new Dictionary<string, string>
{
{ "user1", "password1" },
{ "user2", "password2" },
};
}
Im Folgenden finden Sie den Anmeldevorgang.
<summary>ログイン処理。</summary>
public async Task<ActionResult> OnPost()
{
// 入力内容にエラーがある場合は処理を中断してエラー表示
if (ModelState.IsValid == false) return Page();
// ユーザーの存在チェックとパスワードチェック (仮実装)
// 本 Tips は Cookie 認証ができるかどうかの確認であるため入力内容やパスワードの厳密なチェックは行っていません
if (UserAccounts.TryGetValue(UserName, out string? getPass) == false || Password != getPass)
{
ModelState.AddModelError("", "ユーザー名またはパスワードが一致しません。");
return Page();
}
// サインインに必要なプリンシパルを作る
var claims = new[] { new Claim(ClaimTypes.Name, UserName) };
var identity = new ClaimsIdentity(claims, "FirstAuth");
var principal = new ClaimsPrincipal(identity);
// 認証クッキーをレスポンスに追加
await HttpContext.SignInAsync("FirstAuth", principal);
// ログインが必要な画面にリダイレクトします
return RedirectToPage("/IndexFirst");
}
Der Unterschied zu einer einzelnen Anmeldung besteht darin, dass jeder Schemaname angegeben wird.
Der Speicherort, den Sie angeben, ist ClaimsIdentity
das Argument von und das Argument von HttpContext.SignInAsync
. Hier können Sie angeben, mit welchem Schema Sie sich anmelden möchten.
Die Abmeldung erfolgt auch in Form der Angabe des Schemanamens.
<summary>ログアウト処理。</summary>
public async Task OnGetLogout()
{
// 認証クッキーをレスポンスから削除
await HttpContext.SignOutAsync("FirstAuth");
}
Pages/Account/LoginFirst.cshtml
Die Ansichtsseite unterscheidet sich nicht von einer einzelnen Anmeldung. Bitte stimmen Sie mit dem Modellnamen überein, auf den verwiesen werden soll.
@page
@model LoginFirstModel
@{}
<p>Login1</p>
<form method="post">
<div class="row m-1 g-3">
<div class="col-sm-6 offset-sm-3">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
</div>
</div>
<div class="row m-1 g-3">
<div class="col-sm-6 offset-sm-3">
<label asp-for="UserName" class="form-label"></label>
<input asp-for="UserName" class="form-control" value="user1" />
<span asp-validation-for="UserName" class="text-danger"></span>
</div>
</div>
<div class="row m-1 g-3">
<div class="col-sm-6 offset-sm-3">
<label asp-for="Password" class="form-label"></label>
<input asp-for="Password" class="form-control" value="password1" />
<span asp-validation-for="Password" class="text-danger"></span>
</div>
</div>
<div class="row m-1 g-3">
<div class="col-sm-6 offset-sm-3">
<button type="submit" class="btn btn-primary">ログイン</button>
</div>
</div>
<div class="row m-1 g-3">
<div class="col-sm-6 offset-sm-3">
<a asp-page="/IndexFirst">認証が必要な画面へ直接リンク</a>
</div>
</div>
</form>
@section Scripts {
@{
await Html.RenderPartialAsync("_ValidationScriptsPartial");
}
}
Pages/Account/LoginSecond.cshtml.cs
Hier ist eine weitere Logik für die Anmeldung. First
Second
Es ist einfach anders.
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Security.Claims;
namespace CookieAuthenticationMultipleRazorPages.Pages.Account
{
[AllowAnonymous]
public class LoginSecondModel : PageModel
{
<summary>ユーザー名。</summary>
[BindProperty]
[Required]
[DisplayName("ユーザー名")]
public string UserName { get; set; } = "";
<summary>パスワード。</summary>
[BindProperty]
[Required]
[DataType(DataType.Password)]
[DisplayName("パスワード")]
public string Password { get; set; } = "";
<summary>仮のユーザーデータベースとする。</summary>
private Dictionary<string, string> UserAccounts { get; set; } = new Dictionary<string, string>
{
{ "user1", "password1" },
{ "user2", "password2" },
};
<summary>ログイン処理。</summary>
public async Task<ActionResult> OnPost()
{
// 入力内容にエラーがある場合は処理を中断してエラー表示
if (ModelState.IsValid == false) return Page();
// ユーザーの存在チェックとパスワードチェック (仮実装)
// 本 Tips は Cookie 認証ができるかどうかの確認であるため入力内容やパスワードの厳密なチェックは行っていません
if (UserAccounts.TryGetValue(UserName, out string? getPass) == false || Password != getPass)
{
ModelState.AddModelError("", "ユーザー名またはパスワードが一致しません。");
return Page();
}
// サインインに必要なプリンシパルを作る
var claims = new[] { new Claim(ClaimTypes.Name, UserName) };
var identity = new ClaimsIdentity(claims, "SecondAuth");
var principal = new ClaimsPrincipal(identity);
// 認証クッキーをレスポンスに追加
await HttpContext.SignInAsync("SecondAuth", principal);
// ログインが必要な画面にリダイレクトします
return RedirectToPage("/IndexSecond");
}
<summary>ログアウト処理。</summary>
public async Task OnGetLogout()
{
// 認証クッキーをレスポンスから削除
await HttpContext.SignOutAsync("SecondAuth");
}
}
}
Pages/Account/LoginSecond.cshtml
Ansehen. First
Es ist einfach so und Second
sind anders.
@page
@model LoginSecondModel
@{}
<p>Login Second</p>
<form method="post">
<div class="row m-1 g-3">
<div class="col-sm-6 offset-sm-3">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
</div>
</div>
<div class="row m-1 g-3">
<div class="col-sm-6 offset-sm-3">
<label asp-for="UserName" class="form-label"></label>
<input asp-for="UserName" class="form-control" value="user1" />
<span asp-validation-for="UserName" class="text-danger"></span>
</div>
</div>
<div class="row m-1 g-3">
<div class="col-sm-6 offset-sm-3">
<label asp-for="Password" class="form-label"></label>
<input asp-for="Password" class="form-control" value="password1" />
<span asp-validation-for="Password" class="text-danger"></span>
</div>
</div>
<div class="row m-1 g-3">
<div class="col-sm-6 offset-sm-3">
<button type="submit" class="btn btn-primary">ログイン</button>
</div>
</div>
<div class="row m-1 g-3">
<div class="col-sm-6 offset-sm-3">
<a asp-page="/IndexSecond">認証が必要な画面へ直接リンク</a>
</div>
</div>
</form>
@section Scripts {
@{
await Html.RenderPartialAsync("_ValidationScriptsPartial");
}
}
Pages/Shared/_Layout.cshtml
Fügen Sie jeweils einen Abmeldelink hinzu.
<!-- 中略 -->
<div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
<ul class="navbar-nav flex-grow-1">
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
</li>
<!-- ここから追加 -->
<li class="nav-item">
<a class="nav-link text-dark" asp-page="/Account/LoginFirst" asp-page-handler="Logout">ログアウト(First)</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-page="/Account/LoginFirst">ログアウトせずログインへ(First)</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-page="/Account/LoginSecond" asp-page-handler="Logout">ログアウト(Second)</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-page="/Account/LoginSecond">ログアウトせずログインへ(Second)</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-page="/IndexFirst">IndexFirst</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-page="/IndexSecond">IndexSecond</a>
</li>
<!-- ここまで追加 -->
</ul>
</div>
<!-- 中略 -->
Programme für MVC-Projekte
Erstellen eines Anmeldemodells
Dieses Mal sind die Eingabewerte der beiden Anmeldebildschirme identisch, daher werden wir sie teilen und nur einen erstellen.
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
namespace CookieAuthenticationMultipleMvc.Models
{
public class LoginModel
{
<summary>ユーザー名。</summary>
[Required]
[DisplayName("ユーザー名")]
public string UserName { get; set; } = "";
<summary>パスワード。</summary>
[Required]
[DataType(DataType.Password)]
[DisplayName("パスワード")]
public string Password { get; set; } = "";
}
}
Erstellen eines AccountControllers
Die beiden Anmeldeprozesse sind AccountController
in enthalten, sodass Sie nur einen Controller hinzufügen müssen.
AllowAnonymous
Ordnen Sie es zu, damit Sie darauf zugreifen können, ohne sich anzumelden.
using CookieAuthenticationMultipleMvc.Models;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.Security.Claims;
namespace CookieAuthenticationMultipleMvc.Controllers
{
<remarks>
<see cref="AllowAnonymous"/> 属性は Cookie 認証していなくてもアクセスできる Action (Controller) であることを示す。
</remarks>
[AllowAnonymous]
public class AccountController : Controller
{
}
}
Erstellen Sie ein Dummy-Benutzerkonto.
[AllowAnonymous]
public class AccountController : Controller
{
<summary>仮のユーザーデータベースとする。</summary>
private Dictionary<string, string> UserAccounts { get; set; } = new Dictionary<string, string>
{
{ "user1", "password1" },
{ "user2", "password2" },
};
}
Fügen Sie eine Aktion hinzu, um die Seite für die erste Anmeldung anzuzeigen.
<summary>ログイン画面を表示します。</summary>
public IActionResult LoginFirst() => View();
Nachfolgend finden Sie den Code, der beim Einloggen verarbeitet werden muss.
<summary>ログイン処理を実行します。</summary>
[HttpPost]
public async Task<IActionResult> LoginFirst(LoginModel model)
{
// 入力内容にエラーがある場合は処理を中断してエラー表示
if (ModelState.IsValid == false) return View(model);
// ユーザーの存在チェックとパスワードチェック (仮実装)
// 本 Tips は Cookie 認証ができるかどうかの確認であるため入力内容やパスワードの厳密なチェックは行っていません
if (UserAccounts.TryGetValue(model.UserName, out string? getPass) == false || model.Password != getPass)
{
ModelState.AddModelError("", "ユーザー名またはパスワードが一致しません。");
return View(model);
}
// サインインに必要なプリンシパルを作る
var claims = new[] { new Claim(ClaimTypes.Name, model.UserName) };
var identity = new ClaimsIdentity(claims, "FirstAuth");
var principal = new ClaimsPrincipal(identity);
// 認証クッキーをレスポンスに追加
await HttpContext.SignInAsync("FirstAuth", principal);
// ログインが必要な画面にリダイレクトします
return RedirectToAction(nameof(HomeController.Index), "HomeFirst");
}
Der Unterschied zu einer einzelnen Anmeldung besteht darin, dass jeder Schemaname angegeben wird.
Der Speicherort, den Sie angeben, ist ClaimsIdentity
das Argument von und das Argument von HttpContext.SignInAsync
. Hier können Sie angeben, mit welchem Schema Sie sich anmelden möchten.
Die Abmeldung erfolgt auch in Form der Angabe des Schemanamens.
<summary>ログアウト処理を実行します。</summary>
public async Task<IActionResult> LogoutFirst()
{
// 認証クッキーをレスポンスから削除
await HttpContext.SignOutAsync("FirstAuth");
// ログイン画面にリダイレクト
return RedirectToAction(nameof(LoginFirst));
}
Ich werde auch den zweiten Login hinzufügen. First
Es gibt keinen weiteren Unterschied, wenn man nur den Teil von ändert.Second
// 中略
<summary>ログイン画面を表示します。</summary>
public IActionResult LoginSecond() => View();
<summary>ログイン処理を実行します。</summary>
[HttpPost]
public async Task<IActionResult> LoginSecond(LoginModel model)
{
// 入力内容にエラーがある場合は処理を中断してエラー表示
if (ModelState.IsValid == false) return View(model);
// ユーザーの存在チェックとパスワードチェック (仮実装)
// 本 Tips は Cookie 認証ができるかどうかの確認であるため入力内容やパスワードの厳密なチェックは行っていません
if (UserAccounts.TryGetValue(model.UserName, out string? getPass) == false || model.Password != getPass)
{
ModelState.AddModelError("", "ユーザー名またはパスワードが一致しません。");
return View(model);
}
// サインインに必要なプリンシパルを作る
var claims = new[] { new Claim(ClaimTypes.Name, model.UserName) };
var identity = new ClaimsIdentity(claims, "SecondAuth");
var principal = new ClaimsPrincipal(identity);
// 認証クッキーをレスポンスに追加
await HttpContext.SignInAsync("SecondAuth", principal);
// ログインが必要な画面にリダイレクトします
return RedirectToAction(nameof(HomeController.Index), "HomeSecond");
}
<summary>ログアウト処理を実行します。</summary>
public async Task<IActionResult> LogoutSecond()
{
// 認証クッキーをレスポンスから削除
await HttpContext.SignOutAsync("SecondAuth");
// ログイン画面にリダイレクト
return RedirectToAction(nameof(LoginSecond));
}
// 中略
Erstellen einer Ansicht (Anmeldeformular)
Erstellen Sie jeweils zwei Ansichten.
Es gibt keinen großen Unterschied zwischen einem einzelnen Login und einem Code, daher werde ich den Code so posten, wie er ist.
Views/Account/LoginFirst.cshtml
@model LoginModel
@{}
<h1>Login First</h1>
<form asp-action="LoginFirst">
<div class="row m-1 g-3">
<div class="col-sm-6 offset-sm-3">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
</div>
</div>
<div class="row m-1 g-3">
<div class="col-sm-6 offset-sm-3">
<label asp-for="UserName" class="form-label"></label>
<input asp-for="UserName" class="form-control" value="user1" />
<span asp-validation-for="UserName" class="text-danger"></span>
</div>
</div>
<div class="row m-1 g-3">
<div class="col-sm-6 offset-sm-3">
<label asp-for="Password" class="form-label"></label>
<input asp-for="Password" class="form-control" value="password1" />
<span asp-validation-for="Password" class="text-danger"></span>
</div>
</div>
<div class="row m-1 g-3">
<div class="col-sm-6 offset-sm-3">
<button type="submit" class="btn btn-primary">ログイン</button>
</div>
</div>
<div class="row m-1 g-3">
<div class="col-sm-6 offset-sm-3">
<a asp-controller="HomeFirst" asp-action="Index">認証が必要な画面へ直接リンク</a>
</div>
</div>
</form>
@section Scripts {
@{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
}
Views/Account/LoginSecond.cshtml
@model LoginModel
@{}
<h1>Login Second</h1>
<form asp-action="LoginSecond">
<div class="row m-1 g-3">
<div class="col-sm-6 offset-sm-3">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
</div>
</div>
<div class="row m-1 g-3">
<div class="col-sm-6 offset-sm-3">
<label asp-for="UserName" class="form-label"></label>
<input asp-for="UserName" class="form-control" value="user1" />
<span asp-validation-for="UserName" class="text-danger"></span>
</div>
</div>
<div class="row m-1 g-3">
<div class="col-sm-6 offset-sm-3">
<label asp-for="Password" class="form-label"></label>
<input asp-for="Password" class="form-control" value="password1" />
<span asp-validation-for="Password" class="text-danger"></span>
</div>
</div>
<div class="row m-1 g-3">
<div class="col-sm-6 offset-sm-3">
<button type="submit" class="btn btn-primary">ログイン</button>
</div>
</div>
<div class="row m-1 g-3">
<div class="col-sm-6 offset-sm-3">
<a asp-controller="HomeSecond" asp-action="Index">認証が必要な画面へ直接リンク</a>
</div>
</div>
</form>
@section Scripts {
@{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
}
Bildschirmerstellung nach dem Login
HomeController
Erstellen Sie zwei neue Controller, ohne den vorhandenen zu verwenden.
Dies sind die Controller, auf die Sie nach dem Einloggen zugreifen können.
Jeder Bildschirm ist so eingestellt, dass er je nach dem Bildschirm, bei dem Sie sich angemeldet haben, unterschiedlich zugänglich ist.
HomeFirstController.cs
Da nur der Bildschirm angezeigt wird, gibt es nichts zu verarbeiten.
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace CookieAuthenticationMultipleMvc.Controllers
{
[Authorize(AuthenticationSchemes = "FirstAuth")]
public class HomeFirstController : Controller
{
public IActionResult Index() => View();
}
}
Stattdessen wird ein Attribut an den Controller angefügt und AuthenticationSchemes
der Schemaname als Authorize
Argument angegeben.
FirstAuth
Dadurch wird sichergestellt, dass Sie nur auf diesen Controller zugreifen können, wenn Sie sich mit dem Schema authentifizieren.
HomeSecondController.cs
Second
Erstellen Sie die Seite auf die gleiche Weise.
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace CookieAuthenticationMultipleMvc.Controllers
{
[Authorize(AuthenticationSchemes = "SecondAuth")]
public class HomeSecondController : Controller
{
public IActionResult Index() => View();
}
}
Views/HomeFirst/Index.cshtml
Es gibt nichts besonders Schwieriges, weil es nur angezeigt wird. Unterscheiden Sie sie, damit Sie sehen können, um welche Seite es sich handelt.
@{
ViewData["Title"] = "First View";
}
<div class="text-center">
<h1 class="display-4">First View</h1>
</div>
Ansichten/HomeSecond/Index.cshtml
Zeigen Sie es einfach auch hier.
@{
ViewData["Title"] = "Second View";
}
<div class="text-center">
<h1 class="display-4">Second View</h1>
</div>
Ansichten/Freigegeben/_Layout.cshtml
Fügen Sie jeweils einen Abmeldelink hinzu.
<!-- 中略 -->
<div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
<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="LogoutFirst">ログアウト(First)</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-controller="Account" asp-action="LoginFirst">ログアウトせずログインへ(First)</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-controller="Account" asp-action="LogoutSecond">ログアウト(Second)</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-controller="Account" asp-action="LoginSecond">ログアウトせずログインへ(Second)</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-controller="HomeFirst" asp-action="Index">IndexFirst</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-controller="HomeSecond" asp-action="Index">IndexSecond</a>
</li>
<!-- ここまで追加 -->
</ul>
</div>
<!-- 中略 -->
Bestätigung des Betriebs
Bitte führen Sie es aus, um zu sehen, wie es funktioniert. Ich bin mir sicher, dass Sie bereits gesehen haben, dass die einzelne Anmeldung funktioniert, also Ich denke, es ist eine gute Idee, zu überprüfen, was passiert, wenn Sie auf jeden Bildschirm zugreifen, wenn Sie den Anmeldestatus im folgenden Muster beibehalten.
- Weder First noch Second sind eingeloggt
- Der Erste ist angemeldet und der Zweite ist nicht angemeldet
- Der Erste ist nicht angemeldet, der Zweite ist angemeldet
- Sowohl der Erste als auch der Zweite sind angemeldet