简体   繁体   中英

Accessing cookie expiration time owin

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();
    }

}

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?

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),
};

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM