如何知道 OWIN cookie 何时到期? [英] How to know when OWIN cookie will expire?

查看:18
本文介绍了如何知道 OWIN cookie 何时到期?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想根据 OWIN cookie 的过期时间创建某种倒数计时器.我将 OWIN 与 MVC 5 一起使用,据我所知,默认情况下 SlidingExpiration 处于启用状态.我不使用会话",因为我需要在网络农场中使用此应用程序(我不打算部署会话数据库).

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).

推荐答案

您所需要的只是在 cookie 验证阶段获取 CookieValidateIdentityContext.获得后,提取您需要的任何内容并将它们保留为 Claim 或其他您喜欢的方式.

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.

对于带有 Asp.NET Identity 2.0 的 MVC 5,您需要执行两个步骤:

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

  1. 定义自定义OnValidateIdentity,提取cookie信息,保存为Claim.

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

  • 在您的控制器方法中访问您的Claim

    // 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.

    感谢这篇文章如何我如何访问 Microsoft.Owin.Security.xyz OnAuthenticated 上下文 AddClaims 值?

    这篇关于如何知道 OWIN cookie 何时到期?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆