问题
I am trying to access expiration time on Owin i am using the following example
Access ExpireTimeSpan property of Owin Cookie Authentication to notify user of login expiry
but i cant get to work. I get an error the key, value does exist. I would really appreciate if someone could point me to the right direction thanks.
StartupAuth.cs
var config1 = new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
//LoginPath = new PathString("/Account/Login"),
Provider = new CookieAuthenticationProvider
{
// Enables the application to validate the security stamp when the user logs in.
// This is a security feature which is used when you change a password or add an external login to your account.
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
validateInterval: TimeSpan.FromMinutes(30),
regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
}
};
app.UseCookieAuthentication(config1);
var options = new CookieAuthenticationOptions
{
// usual options such as LoginPath, for example, go here...
LoginPath = new PathString("/Account/Login"),
Provider = new CookieAuthenticationProvider
{
OnValidateIdentity = context =>
{
DateTimeOffset now = DateTimeOffset.UtcNow;
context.OwinContext.Request.Set<double>("time.Remaining",
context.Properties.ExpiresUtc.Value.Subtract(now).TotalSeconds);
return Task.FromResult<object>(null);
}
}
};
app.UseCookieAuthentication(options);
Controller
[Authorize]
public class HomeController : Controller
{
public ActionResult Index()
{
//var secondsRemaining = (double)Request.GetOwinContext()
// .Environment["time.Remaining"];
return View();
}
}
回答1:
This answer has an alternative approach of storing the value. It stores it as a claim. You could try this instead: How to know when OWIN cookie will expire?
回答2:
This is working but kind of ugly.. it accounts for the SlidingExpiration
logic .. note that the claim is empty on the signin request in my case so i just set it to the sessionTimeInMinutes
SlidingExpiration = true,
CookieName = applicationCookieName,
Provider = new CookieAuthenticationProvider
{
// Not called on signin
OnValidateIdentity = context =>
{
// this is the last value before ExpireTimeSpan will update and its not reflected here
var expiresUtc = context.Properties.ExpiresUtc;
if ( expiresUtc == null) return Task.FromResult(0);
var sessionExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(sessionTimeInMinutes);
var expiresDifferenceSeconds =
sessionExpiresUtc.ToUnixTimeSeconds() - expiresUtc?.ToUnixTimeSeconds();
var expires = sessionTimeInMinutes * 60 / expiresDifferenceSeconds < 2
? sessionExpiresUtc
: expiresUtc;
context.Identity.UpdateClaim(CustomClaimTypes.Expires, expires.ToString());
return Task.FromResult(0);
}
}
then i have a filter that adds a expiration cookie that the app uses
DateTimeOffset expires;
if (identity.HasClaim(c => c.Type == CustomClaimTypes.Expires))
{
expires = DateTimeOffset.Parse(identity.FindFirstValue(CustomClaimTypes.Expires));
}
else
{
expires = DateTimeOffset.UtcNow.AddMinutes(sessionTimeInMinutes);
}
var cookieHeaderValues = new List<CookieHeaderValue>
{
new ApplicationCookeHeaderValue("session.expiresAt", expires.ToString("u"), expires),
};
来源:https://stackoverflow.com/questions/33830221/accessing-cookie-expiration-time-owin