Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在MVC5上设置会话变量过期时间?_C#_Asp.net_.net_Asp.net Mvc - Fatal编程技术网

C# 如何在MVC5上设置会话变量过期时间?

C# 如何在MVC5上设置会话变量过期时间?,c#,asp.net,.net,asp.net-mvc,C#,Asp.net,.net,Asp.net Mvc,我需要为登录生成一个验证代码,如:1599 用户登录时必须输入正确的号码 但我的默认会话过期时间为30分钟 我不想让验证码过期这么久。我只需要它保持一分钟。 那么,我如何仅为验证码会话变量设置过期超时 更新1: 我不想更改全局会话的过期时间。我只需要 登录前仅为验证码会话变量设置 会话状态设置 默认情况下,ASP.NET使用cookies来标识属于特定会话的请求。如果cookie不可用,可以通过向URL添加会话标识符来跟踪会话。要禁用Cookie,请设置sessionState Cookieel

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

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

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

我不想让验证码过期这么久。我只需要它保持一分钟。 那么,我如何仅为验证码会话变量设置过期超时

更新1:

我不想更改全局会话的过期时间。我只需要 登录前仅为验证码会话变量设置


会话状态设置

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

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

您应该创建一个存储在SessionState中的类或结构,而不仅仅是存储验证代码本身。这将允许您轻松地检查代码和代码的过期日期

例如:

公共类验证代码{
公共字符串代码{get;set;}
公共日期时间过期日期{get;set;}
}
//用你的方法
VerificationCode newCode=新的VerificationCode{
Code=“1559”,
ExpirationDate=System.DateTime.Now.AddMinutes(1)
};
会话[“验证代码”]=新代码;
//在检查过期日期和代码的方法中。。。
验证代码=(验证代码)会话[“验证代码”];
//您可以在取出验证码后将其删除,因为您只需要
//它只有一次,不管它是好的还是过期的。
删除(“验证代码”);
if(code.ExpirationDate
已更新 -添加了在过期或成功登录时从会话中删除验证代码。
-会话变量的方括号访问器。以前使用的VB(doh!)语法(括号)

您不能为一个特定情况更改会话时间。相反,您可以使用带有
绝对过期
参数的方法将
验证代码
存储在
缓存中

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

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

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

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

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);
 }
//验证码已过期
if((DateTime)会话[“VerificationTime”]).AddMinutes(1)
没有内置方法,但您可以非常简单地实现:

Session[name] = value;

//now add a cleanup task that will run after the specified interval
Task.Delay(expireAfter).ContinueWith((task) => {
    Session.Remove(name);
});
我将其包装到一个非常方便的“会话扩展器”类中,您可以这样使用它:

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

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

条件行似乎必须是“If(code.ExpirationDateSession[name] = value; //now add a cleanup task that will run after the specified interval Task.Delay(expireAfter).ContinueWith((task) => { Session.Remove(name); });
//store and expire after 5 minutes
Session.AddWithTimeout("key", "value", TimeSpan.FromMinutes(5));