Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to know when OWIN cookie will expire?

I would like to create some kind of countdown timer based on the time the OWIN cookie will expire. I am using OWIN with MVC 5 and from what I understand SlidingExpiration is on by default. I do not use 'session' as I need this app to live within a web farm (I dont plan on deploying a session database).

like image 956
FrankO Avatar asked Apr 15 '14 17:04

FrankO


People also ask

How do I check my cookies expiry date?

If you are using Chrome you can goto the "Resources" tab and find the item "Cookies" in the left sidebar. From there select the domain you are checking the set cookie for and it will give you a list of cookies associated with that domain, along with their expiration date.

What is the expiry time of cookie?

Cookies typically expire somewhere between 30 and 90 days. Though, some companies do implement shorter cookie expiration dates. It's also important to note that cookies can be deleted manually by the user or through third-party security programs. The cookie expiration time is very important.

Do web cookies have an expiry date?

Cookies can expire. A cookie with no expiration date specified will expire when the browser is closed. These are often called session cookies because they are removed after the browser session ends (when the browser is closed). Cookies with an expiration date in the past will be removed from the browser.

Which property is used to set expire date for cookie?

The Kind property of Expires is used to determine if the cookie is set to DateTimeKind.


1 Answers

All you need is to get hold of the CookieValidateIdentityContext during the cookie validation stage. Once you get it, extract whatever you need and keep them as Claim or some other way that you prefer.

For MVC 5 with Asp.NET Identity 2.0, you need to perform two steps:

  1. Define custom OnValidateIdentity, extract cookie information, and keep it as Claim.

    public class Startup {   public void Configuration(IAppBuilder app)   {     app.UseCookieAuthentication(new CookieAuthenticationOptions     {       AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,       Provider = new CookieAuthenticationProvider       {         OnValidateIdentity = MyCustomValidateIdentity //refer to the implementation below       }     }   }     // this method will be called on every request   // it is also one of the few places where you can access unencrypted cookie content as CookieValidateIdentityContext   // once you get cookie information you need, keep it as one of the Claims   // please ignore the MyUserManager and MyUser classes, they are only for sample, you should have yours   private static Task MyCustomValidateIdentity(CookieValidateIdentityContext context)   {     // validate security stamp for 'sign out everywhere'     // here I want to verify the security stamp in every 100 seconds.     // but I choose not to regenerate the identity cookie, so I passed in NULL      var stampValidator = SecurityStampValidator.OnValidateIdentity<MyUserManager<Myuser>. MyUser>(TimeSpan.FromSeconds(100), null);      stampValidator.Invoke(context);      // here we get the cookie expiry time     var expireUtc = context.Properties.ExpiresUtc;      // add the expiry time back to cookie as one of the claims, called 'myExpireUtc'     // to ensure that the claim has latest value, we must keep only one claim     // otherwise we will be having multiple claims with same type but different values     var claimType = "myExpireUtc";     var identity = context.Identity;     if(identity.HasClaim(c=> c.Type == claimType))     {       var existingClaim = identity.FindFirst(claimType);       identity.RemoveClaim(existingClaim);      }     var newClaim = new Claim(claimType, expireUtc.Value.UtcTicks.ToString());     context.Identity.AddClaim(newClaim);      return Task.FromResult(0);   } } 
  2. Access your Claim in your controller methods

    // since expiry time has now become part of your claims, you now can get it back easily // this example just returns the remaining time in total seconds, as a string value // assuming this method is part of your controller methods  public string RemainingTime() {   var identity = User.Identity as ClaimsIdentity;   var claimType = "myExpireUtc";  //NOTE: must be the same key value "myExpireUtc" defined in code shown above    if(identity != null && identity.HasClaim(c=> c.Type == claimType))   {      var expireOn = identity.FindFirstValue(claimType);       DateTimeOffset currentUtc = DateTimeOffset.UtcNow;     DateTimeOffset? expireUtc = new DateTimeOffset(long.Parse(expireOn), TimeSpan.Zero);      var remaining = (expireUtc.Value - currentUtc).TotalSeconds;      return remaining.ToString();   }   return string.Empty; } 

I use this approach to remind my application users to extend their session before session time out.

Credit to this post How do I access Microsoft.Owin.Security.xyz OnAuthenticated context AddClaims values?

like image 164
Phyo Avatar answered Oct 06 '22 02:10

Phyo