采用asp.net 的forms认证,采用身份验证票验证登录,怎么样能设置保存期为1年。1年之内不用登录直接进入后台

csharpcn 2008-02-18 09:47:11
具体代码如下:

web.config文件

<authentication mode="Forms">
<forms name=".ASPXAUTH" loginUrl="/login.aspx" timeout="30" path= "/"> </forms>
</authentication>

login.aspx.cs文件

string userRoles = "member"
FormsAuthenticationTicket Ticket = new FormsAuthenticationTicket(1, UserName, DateTime.Now, DateTime.Now.AddMinutes(30), false, userRoles, "/"); //建立身份验证票对象
string HashTicket = FormsAuthentication.Encrypt(Ticket); //加密序列化验证票为字符串
HttpCookie UserCookie = new HttpCookie(FormsAuthentication.FormsCookieName, HashTicket);//生成Cookie
//根据选择Cookie的类型得到过期时间,0为不保存,1为保存1天,2为保存1个月,3为保存1年,4为永久保存我设为99年一般足够了
switch (CookieType)
{
case 0:
break;
case 1:
UserCookie.Expires =DateTime.Now.AddDays(1);
break;
case 2:
UserCookie.Expires = DateTime.Now.AddMonths(1);
break;
case 3:
UserCookie.Expires = DateTime.Now.AddYears(1);
break;
case 4:
UserCookie.Expires = DateTime.Now.AddYears(99);
break;
default:
break;
}
//生成Cookie
HttpContext.Current.Response.Cookies.Add(UserCookie); //输出Cookie
HttpContext.Current.Response.Redirect(Context.Request["ReturnUrl"]); // 重定向到用户申请的初始页面

global.asax文件

protected void Application_AuthorizeRequest(object sender, System.EventArgs e)
{
HttpApplication App = (HttpApplication)sender;
HttpContext Ctx = App.Context; //获取本次Http请求相关的HttpContext对象
if (Ctx.Request.IsAuthenticated == true) //验证过的用户才进行role的处理
{
FormsIdentity Id = (FormsIdentity)Ctx.User.Identity;
FormsAuthenticationTicket Ticket = Id.Ticket; //取得身份验证票
string[] Roles = Ticket.UserData.Split(','); //将身份验证票中的role数据转成字符串数组
Ctx.User = new GenericPrincipal(Id, Roles); //将原有的Identity加上角色信息新建一个GenericPrincipal表示当前用户,这样当前用户就拥有了role信息
}
}

举个例子:
我设置的都是保留1年,而且产生的COOKIE文件经过查看,的确是2009年的日期,在30分钟之内,都可以登录,无论我电脑重启、服务器重启都可以登录到后台,但是为什么30分钟以后我在登录就不好使,让我重新输入登录的名称和密码。

暂时知道的原因
Cookie的有效期是一年,但是票据(FormsAuthenticationTicket)的有效期只有30分钟。
30分钟以后,Cookie仍然在在,但是票据已经过期了,所以又要重新输入用户名与密码来登陆了。

怎么设置或者怎么编程让登录信息保存期为1年。1年之内不用登录的麻烦直接进入后台。

非常感谢各位帮忙!
...全文
554 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
IFocusYou 2012-06-08
  • 打赏
  • 举报
回复
遇到相同问题。标记一下。

虽然俩过期时间都设置了,也要注意pool回收时间
此鱼非彼鱼 2008-02-19
  • 打赏
  • 举报
回复
new FormsAuthenticationTicket(1, UserName, DateTime.Now, DateTime.Now.AddMinutes(30), false, userRoles, "/");

第四个参数为过时时间, 你设定了三十分钟过期, 当然不可能一年了
支持该意见.
shclhs 2008-02-18
  • 打赏
  • 举报
回复
留名
csharpcn 2008-02-18
  • 打赏
  • 举报
回复
OK已经解决了。

必须设置票证的期限才可以。

马上结贴、给分

谢谢大家!
csharpcn 2008-02-18
  • 打赏
  • 举报
回复
使用Response.Cookies.Add(new HttpCookie([cookice名称], [加密后的票据名称]));将票据保存到cookice上去

我又仔细看了一下,你写的与我上面的是一个意思,所以应该不是这个解决的方法

HttpCookie UserCookie = new HttpCookie(FormsAuthentication.FormsCookieName, HashTicket);//生成Cookie
HttpContext.Current.Response.Cookies.Add(UserCookie); //输出Cookie

所以可能还是需要单独设置票证的期限才可以。
csharpcn 2008-02-18
  • 打赏
  • 举报
回复
使用Response.Cookies.Add(new HttpCookie([cookice名称], [加密后的票据名称]));将票据保存到cookice上去
应该好使,我现在是分别设置,没有你这么设置的简单方便,谢谢。

等一会再测试这个看看灵不灵。
feng5799 2008-02-18
  • 打赏
  • 举报
回复
使用Response.Cookies.Add(new HttpCookie([cookice名称], [加密后的票据名称]));将票据保存到cookice上去
csharpcn 2008-02-18
  • 打赏
  • 举报
回复
1、截至为600分钟以后
2、把FALSE 改为TRUE

经过刚才测试
不是2、把FALSE 改为TRUE 的原因,改为True也不好使。
大概是截至为600分钟以后的原因。
就是说应该是验证票有个截至日期,Cookie也需要一个截至日期,这两个都需要有才好使,缺一不可。
正在测试,大概半个小时有结果。

LutzMark 2008-02-18
  • 打赏
  • 举报
回复
很明显 FormsAuthenticationTicket () 构造函数的参数错了...呵呵
csharpcn 2008-02-18
  • 打赏
  • 举报
回复
OK 好使了。

改了两个地方,不知道是哪个地方该对了。
1、截至为600分钟以后
2、把FALSE 改为TRUE

我这次更改一个看看怎么样,剩下的我自己就能解决了,谢谢大家的帮忙。

等一会就结贴加分。
csharpcn 2008-02-18
  • 打赏
  • 举报
回复
因为我主要对30分钟不放心。哈哈
fooboo 2008-02-18
  • 打赏
  • 举报
回复
你先把改成一分钟,不就可以验证了,还非要30分钟?呵呵!
csharpcn 2008-02-18
  • 打赏
  • 举报
回复
FormsAuthenticationTicket的构造函数中:
public FormsAuthenticationTicket (
int version,
string name,
DateTime issueDate,
DateTime expiration,
bool isPersistent, //注意这个参数:如果票证将存储在持久性 Cookie(跨浏览器会话保存),则为 true;否则为 false。如果该票证存储在 URL 中,将忽略此值。
string userData
)
把isPersistent设置成true就可以了。

改了两个地方
1、截至为600分钟以后
2、把FALSE 改为TRUE
正在试验,11点登录看看是否好使。

感觉是switch (CookieType)的问题,中间的代码没有执行。在这代码之前加上这句试试
int CookieType=4;

应该不是这个原因,因为这行代码已经执行了。
并且查看目录中的COOKIE文件截止期限是2009年2月18日,所以应该不是这行的问题。
lwl0376 2008-02-18
  • 打赏
  • 举报
回复
暂时知道的原因
Cookie的有效期是一年,但是票据(FormsAuthenticationTicket)的有效期只有30分钟。
30分钟以后,Cookie仍然在在,但是票据已经过期了,所以又要重新输入用户名与密码来登陆了。
---------------------------------------------------------------------------------------
cookie过不过期跟票据的有效期无关,它的默认值也是30分钟
lwl0376 2008-02-18
  • 打赏
  • 举报
回复
感觉是switch (CookieType)的问题,中间的代码没有执行。在这代码之前加上这句试试
int CookieType=4;
csharpcn 2008-02-18
  • 打赏
  • 举报
回复
修改之后,代码上传,看看30分钟以后如何,希望能好使。
JGood 2008-02-18
  • 打赏
  • 举报
回复
使用票据是可以实现的。
FormsAuthenticationTicket的构造函数中:
public FormsAuthenticationTicket (
int version,
string name,
DateTime issueDate,
DateTime expiration,
bool isPersistent, //注意这个参数:如果票证将存储在持久性 Cookie(跨浏览器会话保存),则为 true;否则为 false。如果该票证存储在 URL 中,将忽略此值。


string userData
)
把isPersistent设置成true就可以了。


同时,FormsAuthentication有个方法:
public static void SetAuthCookie (string userName, bool createPersistentCookie)
参数:createPersistentCookie若要创建持久 Cookie(跨浏览器会话保存的 Cookie),则为 true;否则为 false


csharpcn 2008-02-18
  • 打赏
  • 举报
回复
谢谢,我试一下,需要30分钟以后给你回复。
加分没有问题,可以单独另开一个帖子给你100分。
等35分钟。
skyaspnet 2008-02-18
  • 打赏
  • 举报
回复
对于这段代码,
new FormsAuthenticationTicket(1, UserName, DateTime.Now, DateTime.Now.AddMinutes(30), false, userRoles, "/");

第四个参数为过时时间, 你设定了三十分钟过期, 当然不可能一年了

除此之外, 第五个参数应该为true, 当为真时表示将相关数据存储按照规定时间存储在cookies中

你试一下, 如果行的话就给我加分, 或者加我QQ 343397317一起交流
csharpcn 2008-02-18
  • 打赏
  • 举报
回复
因为现在的系统用的就是票据验证的方式登录的,如果不用这个方式,需要修改很多的代码,会增加很多工作量。

但是如果票据验证的方式登录实在不行,我就用Cookie加密的方式,但是用户登录代码和角色的代码都需要重写,麻烦也没招了。
加载更多回复(4)

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧