🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
.NET Core

.NET Coreは、マネージソフトウェアフレームワークでオープンソースで実装されています。クロスプラットフォームを前提に考えられており、Windows/Mac/Linuxで動くアプリケーションを作成することが可能です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

ASP.NET

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

Q&A

解決済

1回答

4789閲覧

ASP.NETで認証機能を後からの追加で作成した場合、ログインしてもログイン済み状態にならない

woodcube

総合スコア32

.NET Core

.NET Coreは、マネージソフトウェアフレームワークでオープンソースで実装されています。クロスプラットフォームを前提に考えられており、Windows/Mac/Linuxで動くアプリケーションを作成することが可能です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

ASP.NET

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

0グッド

0クリップ

投稿2021/02/11 06:55

編集2021/02/12 06:04

前提・実現したいこと

Visual Studio 2019でASP.Net Coreの3.1でWebアプリケーションを作っています。
認証の機能を後から入れたのですが、ログインに成功はしているのですが、その後ログインしている状態になっていないようです。

1.RazorでWeb アプリケーションを作成しました(認証なしで作成)
2.「新しいスキャフォールディングアイテムの追加」でIDを選び、全てのファイルをオーバーライドします。
3.ユーザークラスに「+」を押して「NInSample003User」を追加し、カスタムプロパティを追加できるようにしました。
(public class NInSample003User : IdentityUserというクラスになる)
4.マイグレーションとDBのアップデートを行いました。
5.実際に実行し、ユーザ登録を行うとDBにアカウント情報が入り、ログインも成功します。
(例えばパスワードを間違えるとエラーになる)
6.しかし、表示されるページは、ログインされた状態にはなっていないようです。
(SignInManager.IsSignedIn(User)でFalseに判断されてしまう)

発生している問題・エラーメッセージ

Page\Shared_LoginPartial.cshtml のファイルの

@using Microsoft.AspNetCore.Identity @using NInSample003.Areas.Identity.Data @inject SignInManager<NInSample003User> SignInManager @inject UserManager<NInSample003User> UserManager <ul class="navbar-nav"> @if (SignInManager.IsSignedIn(User)) //←ここで、Trueにならない { //ログインしている } else { //ログインしていない }

本来ならば、ログイン後は「User.Identity」の中にユーザ名など値が入るようなのですが、入っていないのが原因のようです。
※プロジェクトを「認証あり」で作成して、ステップ実行で動作を見たら、ログイン処理後にデータが入るというのは確認できました。
しかし、上記の方法で作成した場合は、中身が入らない状態です。

特に追加のコードが必要とは思えないのですが、何かコードの追加が必要なのでしょうか?

試したこと

・最初から認証ありで作成した場合は、Userに値が入り、画面もログイン状態の表示になる
・ユーザ登録をすると、DBにはテーブルも存在し、データも入っている。
・ログイン処理は、ステップ実行では「成功」と判断している。

補足情報

・そもそもは、ログインユーザに、一般/オーナー/管理者の区別をつけたい為に、その項目を追加しようとしています。
・ロールでも、実現できるかもしれませんが、それは大げさかと思っています。
・最初から認証ありでプロジェクトを作成した場合は、項目を追加できないという認識でいます。
(クラスを継承して項目を追加するのがセオリーと思っています)

以上、よろしくお願いします。

うまくいかなかった原因(改善方法)

回答者の協力により、下記の事で解決しました。
→ Startup.csの中にapp.UseAuthentication();
が足りていないという事がわかりました。

最初から認証を行う設定でプロジェクトを作成した場合は、自動で入るのですが、後で追加した場合は手入力する必要があるようです。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/02/11 07:47 編集

> ここのUserに値が入らないので、Trueにならない どのように調べたのですか? 匿名アクセスでも値が入らないということはないはずなのですが(ClaimsPrincipal オブジェクトへの参照は必ず入りその中身の Identity が問題)。 認証クッキーのやり取りは正常に行われているか見てみましたか?
woodcube

2021/02/11 08:15

お返事ありがとうございます。 説明が不十分でした @if (SignInManager.IsSignedIn(User))の箇所にブレークポイントを設定して実行し、 停止した時点で、カーソルを置いて中身を確認していました。 そしてウオッチに登録して、中身が変化するタイミングを見ていました。 Userに値が入らないというのは表現の間違いです。 正確には、User.Identity.NameがNullか文字列が入っているかを着目していました。 そうです、ログイン後もIdentityが変化しない事に困っています。 この値はページを推移していく中で、認証クッキーで伝えられていくという事ですか? 認証クッキーは、どこでどうやっているのか、具体的な処理の場所がわかってないです。
退会済みユーザー

退会済みユーザー

2021/02/11 08:56 編集

> Userに値が入らないというのは表現の間違いです。 質問文を編集してそのあたりを正確に書き直していただくようお願いします。 > この値はページを推移していく中で、認証クッキーで伝えられていくという事ですか? ログインに成功するとサーバーから認証クッキーがクライアント(ブラウザ)に発行されます。その後ブラウザはアクセスする度認証クッキーをサーバーに送信するのでそれでユーザー認証されるという仕組みです。そのあたりはホントの基本のキでそれが分かってないと話が通じないので勉強してください。 > 認証クッキーは、どこでどうやっているのか、具体的な処理の場所がわかってないです。 Fiddler を使って要求・応答ヘッダをキャプチャして中身を見てください。ブラウザのデベロッパーツールも使えますが、Fiddler をお勧めします。それなしで Web 開発はできないと言っても過言ではないと個人的には思ってます。
退会済みユーザー

退会済みユーザー

2021/02/11 08:58

問題とは関係ない話ですが・・・ > ロールでも、実現できるかもしれませんが、それは大げさかと思っています。 「一般/オーナー/管理者の区別をつけたい」のであればロールを使う以外ありえません、絶対に。最初からロールを使うことを前提で考えることをお勧めします。
退会済みユーザー

退会済みユーザー

2021/02/12 02:05 編集

> ASP.NETでUser.Identityに値が無く認証状態が維持できない > SignInManager.IsSignedIn(User)でUser.Identityに値が無く、Falseに判断されてしまう 違うと思うのですが? User で取得できるのは ClaimsPrincipal、その Identity プロパティで取得できるのは ClaimsIdentity で「値が無く」ということはないはずです。認証されてないということは ClaimsIdentity の IsAuthenticated プロパティが false になってるはずです。 「認証状態が維持できない」というのもちょっと違うような気がします。認証クッキーのやり時がどうなっているか、Fiddler を使って要求・応答ヘッダをキャプチャして中身を見てくださいと先にアドバイスしましたがやってみましたか?
woodcube

2021/02/12 06:14

Fiddlerは、現在インストールしていろいろ使って勉強している所です。 また、一般/オーナー/管理者の区別は、ロールを使うべきという事は、あらためて別の質問として質問したいと思います。
guest

回答1

0

ベストアンサー

以下の記事のステップ (1), (2) のようにしたのですよね?

ASP.NET Identity で MySQL 利用 (CORE 版)
http://surferonwww.info/BlogEngine/post/2020/05/14/aspnet-core-identity-to-use-mysql.aspx

MVC アプリの場合ですが、その後やらなければならないのは以下の通りです。

  • Startup.cs に追加: services.AddRazorPages(); と app.UseAuthentication(); と endpoints.MapRazorPages();
  • NuGet で Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore を追加
  • Migration を実行: Add-Migration CreateIdentitySchema と Update-Database
  • Areas/Identity/Page/Account/Manage/ の _Layout.cshtml で Layout = "/Views/Shared/_Layout.cshtml"; に変更
  • Views/Shared/_Layout.cshtml に <partial name="_LoginPartial" /> を追加

質問者さんのプロジェクトは MVC ではなく Razor Page のようですので、多少の違いはあると思いますが、確認してください。怪しいのは app.UseAuthentication(); が Startup.cs に追加されてないのではということですが、どうですか?

認証クッキーの件ですが、認証関係がちゃんと動いていれば以下のようになるはずです。Fiddler で確認してください。

(1) Login ページでログインに成功。サーバーから応答ヘッダに含めて認証クッキーが送られてくる(下の画像の赤枠で囲った部分)

イメージ説明

(2) 上の (1) は HTTP 302 応答(リダイレクト指示)なのでブラウザは Location で指定されたページを GET 要求する。その時認証クッキーを要求ヘッダーに含めて送信する(下の画像の赤枠で囲った部分)。

イメージ説明

(3) その後は要求の都度ブラウザからは認証クッキーが送られる。認証クッキーに含まれる認証チケットが有効であればその後の要求はすべて(上の画像で言うと #44, #53, #54, #55 がそれ)認証が通る。

認証チケットが有効で認証が通れば _LoginPartial.cshtml の User は以下の通りとなる。

イメージ説明

投稿2021/02/12 02:00

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

woodcube

2021/02/12 06:11

丁寧な回答ありがとうございました。 app.UseAuthentication();の追加でうまく行きました。 曖昧な表現(=曖昧な理解)に対する指摘も勉強になります。 また、教えていただいた記事のサイトも最近見つけて勉強になっています。 こちらもあわせてありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問