ASP.net的Form验证模式__代替以前的Session__IIS重启后Session问题

yongfa365 2008-12-16 10:16:18
以前用Session方式


//登录成功
Session["UserName"] = dv[0]["UserName"].ToString();
Session["DeptId"] = dv[0]["DeptId"].ToString();

===================================
现在我想用ASP.net的Form验证模式。

现在可以用User.Identity.Name来代替Session["UserName"]

但我应该用什么来代替Session["DeptId"]呢?现在是一个,如果我有多个Session呢?


====================================
期间我想过解决方案:除了UserName外的Session变量,我还是用Session
这样会有个问题:
如果只是Session时,我一重启IIS,再判断Session没值了,所以再让他登录。
而现在我用了Form验证模式后,我重启IIS后,User.Identity.Name仍能正常工作,重启IIS不会对他有影响。而这时如果我有一部分数据是用Session的,这些数据就没了。

我的本意是想用Form验证模式,不用在每页都要判断一下权限,而现在IIS一重启,那些Session都没了,相关页面里我还得判断一下是不是Session没了,如果没了就根据UserName再查一下数据库,这样就又回到以前的Session时代了。

=====================================
怎么弄一下就可以扩展出像User.Identity.Name这样调用UserName一样方便的调用其它的数据。
这里我可能说的不明白,不过相信遇到过这问题的高人应该能明白我在说什么,还望不吝赐教
...全文
802 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lgf8612 2010-10-19
  • 打赏
  • 举报
回复
学习了,不错!
hdsharp 2008-12-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yongfa365 的回复:]
项目紧,先这么实现了:

void Session_Start(object sender, EventArgs e)
{
// 在新会话启动时运行的代码

if (Session["Deptid"] == null)
{
Response.Redirect("/");
}

}

当Session没了就让他再登录一次。理论上也实现了我想要的:权限整体设置,不用一个页一个页设置的目标了。
[/Quote]
是个不错的办法,不过,更要支持二楼的
yongfa365 2008-12-17
  • 打赏
  • 举报
回复
现在这样解决:


if (Session["Deptid"] == null && User.Identity.Name!="")
{
FormsIdentity Id = (FormsIdentity)User.Identity;
FormsAuthenticationTicket Ticket = Id.Ticket; //取得身份验证票
Session["Roles"] = Ticket.UserData;
Session["DeptId"] = Ticket.UserData.Split(',')[0];
}

但这里的UserData是发送到客户端的Cookie,这里的内容可以伪造不,如果可以就郁闷了。

这个过程,服务器端好像什么也没存,只是造出一个票据,然后发到客户端,理论上来说是可以伪造的了,
如果真是这样,那.net的Forms验证的安全性启不是:不安全了。
yongfa365 2008-12-16
  • 打赏
  • 举报
回复
项目紧,先这么实现了:

void Session_Start(object sender, EventArgs e)
{
// 在新会话启动时运行的代码

if (Session["Deptid"] == null)
{
Response.Redirect("/");
}

}

当Session没了就让他再登录一次。理论上也实现了我想要的:权限整体设置,不用一个页一个页设置的目标了。
vrhero 2008-12-16
  • 打赏
  • 举报
回复
正规的做法是扩展MembershipProvider...继承它自己写一个Provider...

要是嫌太麻烦就用2楼的方法,需要时从数据库读...适当用缓存减少数据库交互...
yongfa365 2008-12-16
  • 打赏
  • 举报
回复
我还想到一个方法:
在Global.asax



void Session_Start(object sender, EventArgs e)
{
// 在新会话启动时运行的代码

if (Session["Deptid"]==null)
{
//这里退出当前票据的代码怎么写
}

}
ahone 2008-12-16
  • 打赏
  • 举报
回复
Form验证的本质是用cookie 存放用户信息

既然你都有了User.Identity.Name 那根据这个就可以从数据库把用户其他信息都读出来
无法是你自己写个方法实现
leaohong 2008-12-16
  • 打赏
  • 举报
回复
1.可以自定义MEMBERSHIP
2.FORM认证可以用COOKIE方式
3.这些都是MEMBERSHIP SERVICE的功能,你查一下吧

62,046

社区成员

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

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

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

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