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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

ASP.NET

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

Q&A

解決済

1回答

1716閲覧

Asp.Net Identityを用いてタイムアウト判定を行うには

MASUFISH

総合スコア21

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

ASP.NET

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

0グッド

0クリップ

投稿2022/08/22 02:33

前提

勉強の一環でASP.NET Identiyを用いてWebシステムを作成しています。
その際、タイムアウト機能を実装したく以下のサイトを参考にさせていただこうと考えているのですが、いくつか不明点があり質問させていただきます。
参考サイト:http://surferonwww.info/BlogEngine/post/2020/10/23/judging-expiration-of-authentication-ticket-ussued-by-aspnet-identity.aspx

実現したいこと

おおまかな流れとしては
リクエスト毎

認証チェック
↓(認証切れ)
セッション削除

ログイン画面にリダイレクト
という実装にしたいと考えております。

該当のソースコード

C#

1protected void Application_AcquireRequestState(object sender, EventArgs e) 2 { 3 HttpRequest request = HttpContext.Current.Request; 4 if (request.CurrentExecutionFilePath == "/Account/Login" || request.CurrentExecutionFilePath == "/Account/LogOff") 5 { 6 return; 7 } 8 HttpCookie cookie = request.Cookies.Get(".AspNet.ApplicationCookie"); 9 if (cookie == null) 10 { 11 return; 12 } 13 14 //------------------------------------------------------------------------------ 15 //認証チケットの有効期限が切れていてClaimsIdentity.IsAuthenticated は true でも以下はfalseになる 16 bool isAuthenticatated = ((System.Web.HttpApplication)sender).Request.IsAuthenticated; 17 //------------------------------------------------------------------------------- 18 19 20 string ticket = cookie.Value; 21 ticket = ticket.Replace('-', '+').Replace('_', '/'); 22 int padding = 3 - ((ticket.Length + 3) % 4); 23 if (padding != 0) 24 { 25 ticket = ticket + new string('=', padding); 26 } 27 byte[] bytes = Convert.FromBase64String(ticket); 28 bytes = System.Web.Security.MachineKey.Unprotect(bytes, 29 "Microsoft.Owin.Security.Cookies.CookieAuthenticationMiddleware", 30 "ApplicationCookie", "v1"); 31 32 TicketSerializer serializer = new TicketSerializer(); 33 AuthenticationTicket authTicket = serializer.Deserialize(bytes); 34 35 ClaimsIdentity identity = authTicket.Identity; 36 AuthenticationProperties property = authTicket.Properties; 37 if (identity != null && property != null) 38 { 39 ClaimsPrincipal principal = new ClaimsPrincipal(identity); 40 // クッキーが送られてくると有効期限が切れていても 41 // ClaimsIdentity.IsAuthenticated は true になる 42 bool isAuthenticated = identity.IsAuthenticated; 43 Claim claim = identity.Claims.FirstOrDefault(c => c.Type == ClaimTypes.GivenName); 44 string handleName = claim.Value; 45 DateTimeOffset? expiersUrc = property.ExpiresUtc; 46 if (expiersUrc.Value < DateTimeOffset.UtcNow) 47 { 48 HttpContext context = HttpContext.Current; 49 context.Session.Clear(); 50 context.Session.Abandon(); 51 Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", "")); 52 Response.Redirect("/Account/Login"); 53 } 54 } 55 }

試したこと

// クッキーが送られてくると有効期限が切れていてもClaimsIdentity.IsAuthenticated は true になる bool isAuthenticated = identity.IsAuthenticated;

の箇所は認証チケットの有効期限が切れていたとしても同一リクエストでは、trueになるのは確認でき、これでは判定できないのは分かりました。
しかし

//認証チケットの有効期限が切れていてClaimsIdentity.IsAuthenticated は true でも以下はfalseになる bool isAuthenticatated = ((System.Web.HttpApplication)sender).Request.IsAuthenticated;

は認証チケットの有効期限が切れていてClaimsIdentity.IsAuthenticated は true でもfalse(有効期限切れでなければtrue,切れならfalse)になり、認証チケットの有効期限をチェックしなくても大丈夫ではないかと思えてしまったのですが、ログイン後の認証チェックとしてはこれでは良くないのでしょうか。

②参考のサイトでは、認証チェックの実装をモジュール化していすが、しない場合で、”実現したいこと”を実装する場合には、Global.asax内のHttpApplicationを継承したクラス内にAcquireRequestStateメソッドを実装すれば良いのではと思うのですが、いかがでしょうか。

③”実現したいこと”について、ほかに良い方法或いは、上記実装について指摘等ありましたら、ご教示願います。

初学者な故、理解不足なところが多々あり申し訳ありませんが、よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

ASP.NET MVC5
ASP.NET Identity2
IIS Express

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

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

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

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

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

guest

回答1

0

ベストアンサー

記事は、それに書いてあるように、

一旦認証を受けたが、認証チケットが期限切れになっているというのは、Web サーバー側では以下の条件で判定できるはずです。
・要求 HTTP ヘッダーに認証クッキーが含まれる。
・認証クッキーの中の認証チケットが期限切れ。

・・・ということを確認する手段を書いています。

それを、以下に変えてはどうかということですよね?

・要求 HTTP ヘッダーに認証クッキーが含まれる。
・HttpRequest.IsAuthenticated が false。

質問者さんがご自分の要件に照らして十分検証した結果それで良いとなれば、その方が簡単なのは間違いないので、それでいいのではないですかとしか言いようがないです。

HTTP モジュールを作るか Global.asax.cs に書くかは単にやり方の違いで、実質的にはどっちも同じです。

投稿2022/08/22 03:58

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

MASUFISH

2022/08/22 04:19

ご回答ありがとうございます。 中々調べても、共通した内容がヒットせず、要件によりますが、どういったやり方が一般的なのか分からない次第でした。 因みにですが、仕組み的にHttpRequest.IsAuthenticated は認証チケットの有効期限が切れると、falseになるものなのでしょうか。
退会済みユーザー

退会済みユーザー

2022/08/22 05:59 編集

> 仕組み的にHttpRequest.IsAuthenticated は認証チケットの有効期限が切れると、falseになるものなのでしょうか。 false になるのも ture に書き換えられるのもタイミングによります。結局はどこかのタイミングで「認証クッキーの中の認証チケットが期限切れ」か否かを判定して HttpRequest.IsAuthenticated の true/false を設定する必要がありますが、例えば Application.BeginRequest のタイミングではまだ判定・設定されてないので常に false になるはずです。
MASUFISH

2022/08/22 06:45

>結局はどこかのタイミングで「認証クッキーの中の認証チケットが期限切れ」か否かを判定して HttpRequest.IsAuthenticated の true/false を設定する必要がありますが 今回HttpRequest.IsAuthenticatedがTrueになったのは、どこかのタイミング(=イベント?)で、内部的に?自動で認証チケットの有効期限がチェックされてTrue/Falseが設定されているという認識でよろしいのでしょうか。 そうであれば、そのタイミングの後に認証チェックを行うのであれば、認証チケットの有効期限をチェックする必要はないということになるのでしょうか。
退会済みユーザー

退会済みユーザー

2022/08/22 07:23

そこは自分で考えてください。前にも言いましたが、質問者さんがご自分の要件に照らして十分検証した結果それで良いとなれば、その方が簡単なのは間違いないので、それでいいのではないですかとしか言いようがないです。
MASUFISH

2022/08/22 07:46

承知しました。回答いただきありがとうございました。
退会済みユーザー

退会済みユーザー

2022/08/22 07:49

一つだけ注意。記事からリンクを貼った別の記事「Forms 認証のタイムアウト判定」に書きましたが Forms 認証では 認証チケットが期限切れの場合、FormsAuthenticationModule が認証クッキーを削除します。なので FormsAuthenticationModule.Authenticate イベント以前のタイミングでないと条件の一つ「要求 HTTP ヘッダーに認証クッキーが含まれる」が分からないです。 ASP.NET Identity では FormsAuthenticationModule ではなくOWIN Authentication Middleware を使いますが、そのあたりがどうなっているかは調べてないのでわかりません。
MASUFISH

2022/08/22 08:34

OWIN Authentication Middleware については知らなかったので、調べてます。ありがとうございます。
MASUFISH

2022/08/23 02:22

認証クッキーの削除について >ASP.NET Identity では FormsAuthenticationModule ではなくOWIN Authentication Middleware を使います 調べてみたのですが、理解不足で具体的にどのように実装すれば良いのか見当もつけることが出来ず(どのサイトを参考にすれば良いかも分かりません。)、大変恐縮なのですが、なにか参考となるサイトやアドバイス頂けないでしょうか。 もしくは、無理やりですが、例えば以下のようにして削除する方法は使えないでしょうか(要件次第となるかもしれませんが)。 ''' Response.Cookies[".AspNet.ApplicationCookie"].Expires = DateTime.Now.AddDays(-1); ’’’ よろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2022/08/23 02:32

> 認証クッキーの削除について スレッドの本題「タイムアウト判定を行う」とは違う話なので、新たに別スレッドを立てて質問するようにしてください。 その際、なぜ削除する必要があるのかの理由を書いてください。本来そのような必要は全くないはずで、何かの思い違いとか、XY 問題の可能性がありますので。
MASUFISH

2022/08/23 03:05

失礼いたしました。そのあたりもう少し調べて、理解深めてからにしようと思います。ありがとうございます。
退会済みユーザー

退会済みユーザー

2022/08/23 04:24

ASP.NET Identity を使ったユーザー認証システム全体の動きが分かってないから、このスレッドの課題「タイムアウト判定を行う」とか、「認証クッキーの削除」とかを自分で実装しようと考えてハマっているような気がしますが、違いますか? Visual Studio のテンプレートを使って MVC5 アプリのプロジェクトを作成する際、認証に「個別のアカウント」を選べば、ASP.NET Identity を使ったユーザー認証がシステムとして実装され、「実現したいこと」は、「セッション削除」を除いて(それは必要ないので)、すべて実現済みになります。 そのあたりは分かっているでしょうか?
MASUFISH

2022/08/23 08:56

>ASP.NET Identity を使ったユーザー認証システム全体の動きが分かってないから、、 仰る通りです。 実装としてはテンプレートをベースにしていて、その場合タイムアウトもStartup.AuthのConfigureAuth内で設定できるという認識もあるのですが、 ただ、認証チケットの有効期限が切れたタイミングで、システム内で扱っているセッションを削除したいと考え、上記のようにいたしました。 >「セッション削除」を除いて(それは必要ないので) というのは、今回のケースでタイムアウト時にセッションを削除する必要がないということでしょうか。 セッションを扱っている場合、タイムアウトの時には、セッションをクリアするもの(仕様にもよりますが)と考えていたのですが。 的外れなことでしたら、すみません。
退会済みユーザー

退会済みユーザー

2022/08/23 09:45

質問者さんの言うセッションとは何だか不明ですが、ASP.NET でいうセッションはユーザー認証に一切関係ありません。詳しくは下記。 セッションタイムアウトとログアウト http://surferonwww.info/BlogEngine/post/2013/06/29/session-timeout-and-logout.aspx これ以上詳しい話が聞きたければ新たに別スレッドを立てて質問しください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問