Birden fazla giriş ekranı oluşturun ve giriş yaptığınız ekrandan erişilebilen sayfaları sınırlayın
Çalışma ortamı
- Visual Studio
-
- Visual Studio Topluluğu 2022
- ASP.NET Çekirdek (MVC, Razor Sayfaları)
- 6.0
İlk başta
Bu bölümde, tek bir uygulamada birden fazla oturum açma ekranının nasıl hazırlanacağı ve her oturum açma ekranının erişebileceği sayfaların nasıl ayrılacağı açıklanmaktadır. Tek bir giriş ekranı oluşturma yöntemi "Çerez kimlik doğrulamasını kullanarak bir oturum açma mekanizması oluşturma ve kimliğinizin doğrulanmaması durumunda yeniden yönlendirilecek bir mekanizma oluşturma" başlığı altında açıklanmış ve bu içerik tek bir giriş ekranı oluşturma bilgisine sahip olduğunuz varsayımı üzerinden açıklanmıştır. Bu nedenle, tek bir giriş ekranı ile aynı işlem sadece basit bir açıklamadır.
Proje oluşturma
Razor Pages ve MVC örneği oluşturuyorum, ancak yalnızca kullanmak istediğiniz projeyi oluşturmak sorun değil.
Programı Düzenle.cs (Razor Pages, MVC Ortak)
Bu sefer giriş sayfası ile ulaşılabilen sayfaları "schema" ismine göre ayırma yöntemini kullanacağız.
İlk olarak, ad alanını kodun en üstüne ekleyin.
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authorization;
Aşağıdaki bir inşaatçıdır. Hizmetlere eklenecek kod.
// === 省略 ===
// 「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();
// === 省略 ===
Geçen seferden farkı, çerezlerin ikiye eklenmesidir.
AddCookie
Her birinin ilk bağımsız değişkeni, oturum açmayı tanımlayan şema adını içerir. Bu isim, farklı bir isim olduğu sürece herhangi bir şey olabilir.
İkinci bağımsız değişken, oturum açmadan bir oturum açma işlemine erişildiğinde yeniden yönlendirilecek olan oturum açma sayfası URL'sidir.
Bu arada, bir şema adı belirtmezseniz, CookieAuthenticationDefaults.AuthenticationScheme
.
FallbackPolicy
Ayrıca şemayı için FirstAuth
ayar olarak belirtir. Sonuç olarak, bu el değmemiş Index.cshtml
veya Privacy.cshtml
şema kimlik doğrulamasına FirstAuth
erişim gereklidir.
Aşağıdaki uygulamanın kodu, tek bir oturum açma ile aynıdır.
// === 省略 ===
app.UseRouting();
app.UseAuthentication(); // [追加] 認証
app.UseAuthorization(); // 認可
// 「Razor Pages」のコード
// app.MapRazorPages();
// 「MVC」のコード
// app.MapControllerRoute(
// name: "default",
// pattern: "{controller=Home}/{action=Index}/{id?}");
// === 省略 ===
Razor Pages projeleri için programlar
Giriş yaptıktan sonra sayfa oluşturma
Giriş yaptıktan sonra iki sayfa oluşturun. Yalnızca görüntülenen bir sayfa olduğundan, nerede oturum açtığınızı görebilmeniz için yaparsanız sorun olmaz.
Sayfalar/IndexFirst.cshtml
@page
@model IndexFirstModel
@{
ViewData["Title"] = "First page";
}
<div class="text-center">
<h1 class="display-4">First Page</h1>
</div>
Bu konuda özellikle önemli bir şey yoktur, ancak başvurduğunuz modelin oluşturduğunuz sayfayla IndexFirstModel
eşleştiğinden emin olun.
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() { }
}
}
Yalnızca görüntülendiği için özel bir işlem yoktur, ancak sınıf adının bir özniteliği Authorize
olarak eklediğimizi unutmayın.
AuthenticationSchemes
Bağımsız değişken, Program.cs'da belirtilen şema adına ayarlanır.
Bu, yalnızca bu şema adıyla oturum açarsanız bu sayfayı görüntüleyebilmenizi sağlar. Bu sayfayı giriş yapmadan ziyaret ederseniz, giriş sayfasına yönlendirileceksiniz.
Sayfalar/IndexSecond.cshtml
Bu, girişten sonraki ikinci sayfadır.
@page
@model IndexSecondModel
@{
ViewData["Title"] = "Second page";
}
<div class="text-center">
<h1 class="display-4">Second Page</h1>
</div>
Pages/IndexSecond.cshtml.cs
Kodun temelde ilk oturum açma sayfasıyla aynı olduğunu, ancak şema adının farklı olduğunu unutmayın.
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() { }
}
}
Giriş Sayfası Oluşturma
İki oturum açma sayfası oluşturun.
Pages/Account/LoginFirst.cshtml.cs
Oturum açmadan AllowAnonymous
erişebilmeniz için özniteliği ekleyin.
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
{
}
}
Girdiğiniz oturum açma bilgilerini almak için bir değişken ve sahte bir kullanıcı hesabı oluşturun.
[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" },
};
}
Giriş işlemi aşağıdadır.
<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");
}
Tek bir oturum açmadan farkı, her şema adının belirtilmesidir.
Belirttiğiniz konum, 'nin bağımsız değişkeni ve 'nin HttpContext.SignInAsync
bağımsız değişkenidirClaimsIdentity
. Burada hangi şema ile giriş yapmak istediğinizi belirtebilirsiniz.
Logout aynı zamanda şema adının belirtilmesi şeklindedir.
<summary>ログアウト処理。</summary>
public async Task OnGetLogout()
{
// 認証クッキーをレスポンスから削除
await HttpContext.SignOutAsync("FirstAuth");
}
Sayfalar/Hesap/LoginFirst.cshtml
Görünüm tarafı, tek bir girişten farklı değildir. Lütfen referans alınacak model adını eşleştirin.
@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
İşte başka bir oturum açma mantığı. First
Second
Sadece farklı.
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");
}
}
}
Sayfalar/Hesap/LoginSecond.cshtml
Görünüm. First
Sadece bu ve Second
farklı.
@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");
}
}
Sayfalar/Paylaşılan/_Layout.cshtml
Her biri için bir çıkış bağlantısı ekleyin.
<!-- 中略 -->
<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>
<!-- 中略 -->
MVC Projeleri için Programlar
Oturum Açma Modeli Oluşturma
Bu sefer iki giriş ekranının giriş değerleri aynı, bu yüzden bunları paylaşacağız ve sadece bir tane oluşturacağız.
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; } = "";
}
}
AccountController Oluşturma
İki oturum açma işlemi 'a dahil edilmiştir, AccountController
bu nedenle yalnızca bir denetleyici eklemeniz gerekir.
AllowAnonymous
Giriş yapmadan erişebilmeniz için bunu ilişkilendirin.
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
{
}
}
Sahte bir kullanıcı hesabı oluşturun.
[AllowAnonymous]
public class AccountController : Controller
{
<summary>仮のユーザーデータベースとする。</summary>
private Dictionary<string, string> UserAccounts { get; set; } = new Dictionary<string, string>
{
{ "user1", "password1" },
{ "user2", "password2" },
};
}
İlk oturum açma sayfasını görüntülemek için bir eylem ekleyin.
<summary>ログイン画面を表示します。</summary>
public IActionResult LoginFirst() => View();
Giriş yaparken işlenecek kod aşağıdadır.
<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");
}
Tek bir oturum açmadan farkı, her şema adının belirtilmesidir.
Belirttiğiniz konum, 'nin bağımsız değişkeni ve 'nin HttpContext.SignInAsync
bağımsız değişkenidirClaimsIdentity
. Burada hangi şema ile giriş yapmak istediğinizi belirtebilirsiniz.
Logout aynı zamanda şema adının belirtilmesi şeklindedir.
<summary>ログアウト処理を実行します。</summary>
public async Task<IActionResult> LogoutFirst()
{
// 認証クッキーをレスポンスから削除
await HttpContext.SignOutAsync("FirstAuth");
// ログイン画面にリダイレクト
return RedirectToAction(nameof(LoginFirst));
}
İkinci girişi de ekleyeceğim. First
Sadece parçasını Second
değiştirerek başka bir fark yoktur.
// 中略
<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));
}
// 中略
Görünüm Oluşturma (Giriş Formu)
Her biri iki görünüm oluşturun.
Tek bir giriş ile kod arasında pek bir fark yok, bu yüzden kodu olduğu gibi yayınlayacağım.
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"); }
}
Giriş yaptıktan sonra ekran oluşturma
HomeController
Mevcut denetleyiciyi kullanmadan iki yeni denetleyici oluşturun.
Bunlar, oturum açtıktan sonra erişebileceğiniz denetleyicilerdir.
Her ekran, oturum açtığınız ekrana bağlı olarak farklı şekilde erişilebilir olacak şekilde ayarlanmıştır.
HomeFirstController.cs
Yalnızca ekranı görüntülediğinden, işleme eklenecek bir şey yoktur.
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace CookieAuthenticationMultipleMvc.Controllers
{
[Authorize(AuthenticationSchemes = "FirstAuth")]
public class HomeFirstController : Controller
{
public IActionResult Index() => View();
}
}
Bunun yerine, denetleyiciye bir öznitelik ekler ve AuthenticationSchemes
şema adını bağımsız değişken olarak Authorize
belirtir.
FirstAuth
Bu, yalnızca şema ile kimlik doğrulaması yapıyorsanız bu denetleyiciye erişebilmenizi sağlar.
HomeSecondController.cs
Second
Tarafı da aynı şekilde oluşturun.
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
Sadece görüntülendiği için özellikle zor bir şey yok. Hangi sayfa olduğunu görebilmeniz için bunları ayırt edin.
@{
ViewData["Title"] = "First View";
}
<div class="text-center">
<h1 class="display-4">First View</h1>
</div>
Views/HomeSecond/Index.cshtml
Sadece burada da gösterin.
@{
ViewData["Title"] = "Second View";
}
<div class="text-center">
<h1 class="display-4">Second View</h1>
</div>
Görünümler/Paylaşılan/_Layout.cshtml
Her biri için bir çıkış bağlantısı ekleyin.
<!-- 中略 -->
<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>
<!-- 中略 -->
Operasyonun onaylanması
Nasıl çalıştığını görmek için lütfen çalıştırın. Eminim tek oturum açmanın işe yaradığını zaten görmüşsünüzdür, bu yüzden Giriş durumunu aşağıdaki düzende tuttuğunuzda her ekrana eriştiğinizde ne olacağını kontrol etmenin iyi bir fikir olduğunu düşünüyorum.
- Ne Birinci ne de İkinci oturum açmaz
- İlk oturum açıldı ve İkinci oturum açılmadı
- Birincisi giriş yapılmadı, İkincisi giriş yapıldı
- Hem Birinci hem de İkinci oturum açtı