.net - ¿Cómo saber cuándo caducará la cookie OWIN?
asp.net-mvc-5 session-cookies (1)
Me gustaría crear algún tipo de temporizador de cuenta regresiva en función del tiempo de caducidad de la cookie OWIN. Estoy usando OWIN con MVC 5 y, por lo que entiendo, SlidingExpiration está activado de manera predeterminada. No uso "sesión" porque necesito que esta aplicación viva dentro de una granja de servidores web (no planeo implementar una base de datos de sesión).
Todo lo que necesitas es conseguir el CookieValidateIdentityContext
durante la etapa de validación de cookies. Una vez que lo obtenga, extraiga lo que necesite y guárdelo como Claim
o de alguna otra forma que prefiera.
Para MVC 5 con Asp.NET Identity 2.0, debe realizar dos pasos:
Defina
OnValidateIdentity
personalizado, extraiga información de cookies y manténgalo comoClaim
.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); } }
Acceda a su
Claim
en sus métodos de control// 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; }
Utilizo este enfoque para recordar a los usuarios de mi aplicación que extiendan su sesión antes de que se agote el tiempo de espera.
Crédito a esta publicación ¿Cómo accedo a los valores de AddClaims de Microsoft.Owin.Security.xyz OnAuthenticated context?