如何在MVC 5上设置Session变量过期时间?

时间:2014-10-13 05:24:28

标签: c# asp.net .net asp.net-mvc

我需要为登录生成验证码,如: 1599

登录时,用户必须输入正确的号码。

但我的默认会话过期时间 30分钟

我不想让验证码过期这么久。我只需要保持 1分钟。 那么我如何仅为Verification Code会话变量设置过期时间?

UPDATE1:

  

我不想改变全球会话过期时间。我只需要   在登录前仅为Verification Code会话变量设置。

5 个答案:

答案 0 :(得分:4)

没有内置方式,但你可以很简单地实现它:

Session[name] = value;

//now add a cleanup task that will run after the specified interval
Task.Delay(expireAfter).ContinueWith((task) => {
    Session.Remove(name);
});

我将它包装成一个非常方便的会议扩展器"类source code here你可以像这样使用它:

//store and expire after 5 minutes
Session.AddWithTimeout("key", "value", TimeSpan.FromMinutes(5));

PS。如果您仍然使用旧的.NET版本(没有异步代码,没有任务),您也会在我的博客帖子中找到兼容版本。

答案 1 :(得分:3)

您应该创建一个存储在SessionState中的类或结构,而不仅仅是存储验证代码本身。这样您就可以轻松检查代码和代码的截止日期。

E.g:

public class VerificationCode {
    public string Code { get; set; }
    public DateTime ExpirationDate { get; set; }
}

// in your method
VerificationCode newCode = new VerificationCode {
                                         Code="1559",
                                         ExpirationDate = System.DateTime.Now.AddMinutes(1)
                                     };
Session["VerificationCode"] = newCode;


// in the method where you check the expiration date and code...
VerificationCode code = (VerificationCode)Session["VerificationCode"];

// you can remove the verification code after pulling it out, as you only need
//  it once, regardless of whether it is still good or expired.
Session.Remove("VerificationCode");

if (code.ExpirationDate < System.DateTime.Now){
   // the verification code expired...

   // can remove the verification code after successful login
   Session.Remove("VerificationCode");
} else {
  // verification code is still good.
  // Log the user in?

  // can remove the verification code after successful login
  Session.Remove("VerificationCode");
}

<强>更新 - 在过期或成功登录后添加了从会话中删除验证码。 - Session变量的方括号访问器。以前使用VB(doh!)语法(括号)

答案 2 :(得分:2)

您无法更改某个特定案例的会话时间。相反,您可以使用Cache.Add方法和absoluteExpiration参数在VerificationCode中存储Cache

MemoryCache.Default.Add([UserIdentity], [Verification Code], 
    new DateTimeOffset().ToOffset(TimeSpan.FromMinutes(1)));

然后从Cache

获取
var verificationCode = MemoryCache.Default.Remove([UserIdentity]);

答案 3 :(得分:2)

对不起伙计们,我终于使用了这个解决方案:

生成验证码时,我会将其保存到会话

Session["VerificationCode"] = code;

大家都知道。但是时间怎么样?我改变了它:

Session["VerificationCode"] = code;
Session["VerificationTime"] = DateTime.Now; 

现在节省时间。然后我可以在用户登录时找到它:

 // Verification Code Expired
 if ((DateTime)Session["VerificationTime"]).AddMinutes(1) < DateTime.Now)
 {
       ModelState.AddModelError("VerificationCode", "Verification Code Expired!");
       return View(adminLogin);
 }
 // Verification Code Error
 if (Session["VerificationCode"].ToString().ToUpper() != adminLogin.VerificationCode.ToUpper())
 {
       ModelState.AddModelError("VerificationCode", "Verification Code Error");
       return View(adminLogin);
 }

答案 4 :(得分:0)

会话状态设置

默认情况下,ASP.NET使用cookie来标识哪些请求属于特定会话。如果cookie不可用,则可以通过向URL添加会话标识符来跟踪会话。要禁用cookie,请设置sessionState cookieless="true".但这将更改应用程序可用的所有会话的设置。

<configuration>
<system.web>
    <sessionState mode="StateServer" cookieless="false" timeout="120"/>
</system.web>
</configuration>

参考文献:http://msdn.microsoft.com/en-us/library/ms525473%28v=vs.90%29.aspx


在你的情况下你可以使用cookie跟踪并将其设置为在1分钟后过期,我可以给你一个例子:

Response.Cookies["userName"].Value = "patrick";
Response.Cookies["userName"].Expires =DateTime.Now.AddMinutes(1);
HttpCookie aCookie = new HttpCookie("lastVisit");
aCookie.Value = DateTime.Now.ToString();
aCookie.Expires = DateTime.Now.AddDays(1);
Response.Cookies.Add(aCookie);