前提
勉強の一環で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

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/08/22 04:19
退会済みユーザー
2022/08/22 05:59 編集
2022/08/22 06:45
退会済みユーザー
2022/08/22 07:23
2022/08/22 07:46
退会済みユーザー
2022/08/22 07:49
2022/08/22 08:34
2022/08/23 02:22
退会済みユーザー
2022/08/23 02:32
2022/08/23 03:05
退会済みユーザー
2022/08/23 04:24
2022/08/23 08:56
退会済みユーザー
2022/08/23 09:45