質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

1回答

5404閲覧

ASP.NET CoreでCookie認証をした後に、ログインユーザー名またはログイン中であることを画面上に表示したい。

opo3939222

総合スコア6

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

0クリップ

投稿2020/04/06 06:25

編集2020/04/06 07:35

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/04/06 06:39 編集

> ASP.Net Core 3.1でCookie認証を使ってログインを行うページを現在作っております。 その「Cookie認証」というのは何ですか? VS2019 のテンプレートを使ってプロジェクトを作成するときに「認証」に「個別のユーザーアカウント」を選択すると ASP.NET Identity ベースの認証システム(クッキーベースの認証になります)が自動的に実装されますがそれですか? それとも、質問者さんが作った独自認証ですか?
退会済みユーザー

退会済みユーザー

2020/04/06 06:40

質問の表示が崩れてしまっています。コードのみ ``` と ``` で囲うようにしてください。
opo3939222

2020/04/06 07:05

Identityのcookie認証方式ではなく独自の認証方式によってユーザー名とパスワードでログインを行う形にしました。下のリンクを参考にCookieとsessionによってログインデータの管理を行っております。 https://qiita.com/Nossa/items/8d35e665ef93f235f27d
退会済みユーザー

退会済みユーザー

2020/04/06 14:56 編集

それを質問欄を編集して追記してください。
退会済みユーザー

退会済みユーザー

2020/04/07 01:19 編集

テンプレートで自動生成する ASP.NET Core Identity ベースではなく独自に実装したい理由・要件はなんでしょうか? その理由・要件を満足するのが目的で、手段は問わない (目的さえ果たせれば ASP.NET Core Identity でも問題ない) と言うことであれば、独自実装で解決するより Identity を使って目的を果すと言うアプローチを考えた方が現実的かもしれません。 独自と言うことになると答を得るのが難しいと思います。(独自の部分がどうなっているかを読み解いて対策を考えるというのは他人にはハードルが高いので。少なくとも自分は、独自実装では詳しく見る気力がわいてこないのでお役に立てませんが、Identity ベースであれば何か提案できるかもしれません)
opo3939222

2020/04/07 02:18

実は他の処理の部分においてIdentityベースで行うことも視野に入れております。 もしまた何かわからないことがあれば質問させていただきます。 大変お忙しい中、ご対応ありがとうございました。
guest

回答1

0

自己解決

アプリ立ち上げ時のメソッドの呼び出しでエラーが発生しておりました。

上部のタグヘルパー@の部分を削除してif句の内部をUser.Identity.IsAuthenticatedという記述にしたら解決しました。

<ul class="navbar-nav"> @if (User.Identity.IsAuthenticated) { <li class="nav-item"> <a class="nav-link text-dark" asp-area="" asp-page="/Account/Manage/Index" title="Manage">Hello @User.Identity.Name</a> </li> <li class="nav-item"> <form class="form-inline" asp-area="" asp-page="/Account/Logout" asp-route-returnUrl="@Url.Page("/", new { area = "" })" method="post"> <button type="submit" class="nav-link btn btn-link text-dark">ログアウト</button> </form> </li> } else { <li class="nav-item"> <a class="nav-link text-dark" asp-area="" asp-page="/Account/Register">登録</a> </li> <li class="nav-item"> <a class="nav-link text-dark" asp-area="" asp-page="/Account/Login">ログイン</a> </li> } </ul>

投稿2020/04/07 02:16

opo3939222

総合スコア6

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問