Accessing cookie expiration time owin

夙愿已清 提交于 2020-01-02 07:11:22

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!