首页 新闻 赞助 找找看

ASP.NET MVC环境下利用Froms窗体认证失败的问题!!

0
悬赏园豆:50 [已关闭问题] 关闭于 2011-03-18 14:33

利用Visual Studio 2010搭建了ASP.NET MVC 2 的开发环境,想利用MVC的Filter功能和Asp.Net的Forms窗体认证来实现简单的登录认证,部分代码如下:

AuFilter:

1 publicclass AuFilter: ActionFilterAttribute
2 {
3 publicoverridevoid OnActionExecuting(ActionExecutingContext filterContext)
4
5 {
6 if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
7 {
8 filterContext.Result =new RedirectToRouteResult("Default", new RouteValueDictionary(new { controller ="Account", action ="Login" }));
9
10 }
11 }
12
13 }

HomeController:

1 publicclass HomeController : Controller
2 {
3 //
4 // GET: /Home/
5  
6 [AuFilter]
7 public ActionResult Index()
8 {
9 ViewData["UserState"] = HttpContext.User.Identity.IsAuthenticated.ToString();
10 return View();
11 }
12
13 public ActionResult About()
14 {
15 ViewData["UserState"] = HttpContext.User.Identity.IsAuthenticated.ToString();
16 return View();
17 }
18
19 }

AccountController:

1 public ActionResult DoLogin()
2 {
3 SiteUser UserInfo =new SiteUser();//实例化SiteUser类。
4  
5 UserInfo.UserName = Request["UserName"];
6 UserInfo.PassWord = Request["PassWord"];
7
8 if (UserInfo.UserName =="aa"&& UserInfo.PassWord =="bb")
9 {
10 //处理认证的代码,先后使用过三种代码,代码见下面。
11 }
12 return RedirectToAction("Index","Home");
13
14 }

问题在于,我先后利用FormsAuthentication.SetAuthCookie,FormsAuthentication.RedirectFromLoginPage,FormsAuthenticationTicket三种认证方式,均无法通过认证,无法写入Cookie,因为我在About.aspx页面设置了用ViewData["UserName"] = HttpContext.User.Identity.IsAuthenticated.ToString();的方式取到的值都是False。

1)FormsAuthentication.SetAuthCookie

 

1 FormsAuthentication.SetAuthCookie(UserInfo.UserName, false, FormsAuthentication.FormsCookiePath);

2)FormsAuthentication.RedirectFromLoginPage

 

 

1 FormsAuthentication.RedirectFromLoginPage(UserInfo.UserName, false);

3)FormsAuthenticationTicket

 

 

1 ////创建身份验证票
2   FormsAuthenticationTicket AuTicket =new FormsAuthenticationTicket(
3 1, UserInfo.UserName, DateTime.Now, DateTime.Now.AddMinutes(30),
4 false, Request.UserHostAddress);
5 ////将票据加密
6  string authTicket = FormsAuthentication.Encrypt(AuTicket);
7 ////将加密后的票据保存为cookie
8 HttpCookie coo =new HttpCookie(FormsAuthentication.FormsCookieName, authTicket);
9 coo.Secure =false;
10 coo.Expires = AuTicket.Expiration;
11 coo.Path = FormsAuthentication.FormsCookiePath;
12 ////加入新cookie
13 Response.Cookies.Add(coo);

第1种和第3中方式,点击登录以后,回到Account/Login,不能转到Home/Index,说明没有通过认证,访问Home/About,也显示IsAuthenticated值为False。

第2种方式,点击登录后,转到Home/Index,Index页面的IsAuthenticated值为True,但是再转到任何一个页面以后,IsAuthenticated值立刻变为False,包括Index页面本身。

请教各位前辈,这到底是怎么回事呢?请帮帮我,谢谢了。

问题补充: 借助于强大的互联网,自己把问题解决了。有点小小得成就感。 有人遇到相同问题可以问我,乐意帮忙。呵呵。
eez的主页 eez | 初学一级 | 园豆:96
提问于:2011-03-15 16:29
< >
分享
所有回答(2)
0

ControllerContext.HttpContext.User.Identity.Name

dudu | 园豆:31075 (高人七级) | 2011-03-15 17:14
加上ControllerContext以后,第一种方式的效果变成第二种方式的效果了。还是不行啊。
支持(0) 反对(0) eez | 园豆:96 (初学一级) | 2011-03-15 20:55
谁能帮帮我呢!!
支持(0) 反对(0) eez | 园豆:96 (初学一级) | 2011-03-16 22:28
你好,我也碰到问题,我也解决了,多谢你这篇文章
支持(0) 反对(0) wtq | 园豆:146 (初学一级) | 2011-04-21 15:39
0

楼主用的是IE10或者是windows server版本操作系统吧,这是IE10的一个bug或者说是asp.net mvc的一个Bug

在IE10里更改了http头,这样导致asp.net mvc认为客户端没有启用cookie,会导致验证失败。
简单的解决方法是,在网站根目录,新增一个浏览器定义文件(browser definition file)
步骤如下:
1.添加一个"App_Browsers"文件夹
2.添加一个"*.browser"后缀的文件,如IE10.browser.
3.添加文件内容如下:
<browsers>
<browser refID="Default">
<capabilities><!-- To avoid wrong detections of e.g. IE10 -->
<capability name="cookies" value="true" />
<capability name="ecmascriptversion" value="3.0" />
</capabilities>
</browser>
</browsers>

ToKens | 园豆:184 (初学一级) | 2013-12-24 22:33
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册