前提・実現したいこと
ASP.Net Core 3.1でCookie認証を使ってログインを行うページを現在作っております。
そこで、ログインに成功した際に右上にログインしたことが分かるようにログインユーザー名か
ログイン中であることを表示することを通知するメッセージを作りたいと考えています。
(ASP.NET Core Identityのログイン画面のような感じです)
発生している問題・エラーメッセージ
ASP.NET Core Identityの_LoginPartialを参考にして
記述してみたのですがどうも起動時にエラーとなってしまいます。
@using Microsoft.AspNetCore.http @inject Httpcontext httpcontext <ul class="navbar-nav"> @if ((httpcontext.User.Identity.IsAuthenticated) {` <li class="nav-item"> <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Manage/Index" title="Manage">Hello @User.Identity.Name!</a> </li> <li class="nav-item"> <form class="form-inline" asp-area="Identity" asp-page="/Account/Logout" asp-route-returnUrl="@Url.Page("/", new { area = "" })" method="post" > <button type="submit" class="nav-link btn btn-link text-dark">Logout</button> </form> </li> } else { <li class="nav-item"> <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Register">Register</a> </li> <li class="nav-item"> <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a> </li> } </ul>
ログインを行うクラス using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Security.Claims; using System.Threading.Tasks; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.EntityFrameworkCore; using WebApp8.Data; using WebApp8.Models; namespace WebApp8.Pages.Account { [AllowAnonymous] public class LoginModel : PageModel { private readonly DBsetuzokuContext _context; public LoginModel(DBsetuzokuContext context) { _context = context; } [BindProperty] public InputModel Input { get; set; } public class InputModel { [Required] public string LoginID { get; set; } [Required] [DataType(DataType.Password)] public string Password { get; set; } [Display(Name = "Remember me?")] public bool RememberMe { get; set; } } [TempData] public string ErrorMessage { get; set; } public IList<User> User { get; set; } public async Task<IActionResult> OnPostAsync(string returnUrl = null) { if (!ModelState.IsValid) return Page(); // ================================================== // 認証処理 var result = from u in _context.User select u; result = result.Where(s => s.UserLoginID == Input.LoginID); User = await result.ToListAsync(); if (User.Count == 0) { //bool isValid = false; return Page(); } if (User[0].Password != Input.Password) { //bool isValid = true; return Page(); } Claim[] claims = { new Claim(ClaimTypes.NameIdentifier, Input.LoginID), new Claim(ClaimTypes.Name, Input.LoginID), }; // 一意の ID 情報 var claimsIdentity = new ClaimsIdentity( claims, CookieAuthenticationDefaults.AuthenticationScheme); // ログイン await HttpContext.SignInAsync( CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(claimsIdentity), new AuthenticationProperties { // Cookie をブラウザー セッション間で永続化するか?(ブラウザを閉じてもログアウトしないかどうか) IsPersistent = Input.RememberMe }); return LocalRedirect(returnUrl ?? Url.Content("~/")); } } }
試したこと
Cookie認証を行った際のデータを使用してログインしたらユーザー名を表示するために
ほかにもCookiePolicyやAuthenticationを使ってみたのですがどうにもうまくいきません。
補足情報(FW/ツールのバージョンなど)
使用環境
ASP.NET Core 3.1
Visual Studio 2019 community
Razor Pages
> ASP.Net Core 3.1でCookie認証を使ってログインを行うページを現在作っております。
その「Cookie認証」というのは何ですか?
VS2019 のテンプレートを使ってプロジェクトを作成するときに「認証」に「個別のユーザーアカウント」を選択すると ASP.NET Identity ベースの認証システム(クッキーベースの認証になります)が自動的に実装されますがそれですか?
それとも、質問者さんが作った独自認証ですか?
質問の表示が崩れてしまっています。コードのみ ``` と ``` で囲うようにしてください。
Identityのcookie認証方式ではなく独自の認証方式によってユーザー名とパスワードでログインを行う形にしました。下のリンクを参考にCookieとsessionによってログインデータの管理を行っております。
https://qiita.com/Nossa/items/8d35e665ef93f235f27d
それを質問欄を編集して追記してください。
テンプレートで自動生成する ASP.NET Core Identity ベースではなく独自に実装したい理由・要件はなんでしょうか?
その理由・要件を満足するのが目的で、手段は問わない (目的さえ果たせれば ASP.NET Core Identity でも問題ない) と言うことであれば、独自実装で解決するより Identity を使って目的を果すと言うアプローチを考えた方が現実的かもしれません。
独自と言うことになると答を得るのが難しいと思います。(独自の部分がどうなっているかを読み解いて対策を考えるというのは他人にはハードルが高いので。少なくとも自分は、独自実装では詳しく見る気力がわいてこないのでお役に立てませんが、Identity ベースであれば何か提案できるかもしれません)
実は他の処理の部分においてIdentityベースで行うことも視野に入れております。
もしまた何かわからないことがあれば質問させていただきます。
大変お忙しい中、ご対応ありがとうございました。
回答1件
あなたの回答
tips
プレビュー