在Global.asax中,我定义了一个Application_AuthenticateRequest,代码如下:
HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie != null)
{
FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
JIdentity identity = new JIdentity(authTicket);
JPrincipal principal = new JPrincipal(identity);
HttpContext.Current.User = principal;
Thread.CurrentPrincipal = principal;
}
每当我发出请求的时候,都是执行以上代码,判断是否验证。
但是我发现,有的时候我通过AJAX请求一个Action的时候,在执行以上代码的时候,authTicket为空,即Request.Cookies取不到值。譬如我通过以下JS代码:
$("#uploadify").uploadify({
uploader: '/Skins/Shared/uploadify/uploadify.swf',
script: 'Upload',
method:'POST',
cancelImg: '/Skins/Shared/uploadify/cancel.png',
fileDesc: '支持类型(图像、Office、视频、文本、压缩文件)',
multi: true,
fileExt: '*.jpg;*.jpeg;*.gif;*.png;*.doc;*.xls;*.ppt;*.pdf;*.txt',
onAllComplete: function(event, data) {
alert('上传成功,总共上传了' + data.filesUploaded + ",错误内容:" + data.errors);
}
});
上面script: 'Upload'就是我调的一个Action,如下:
public ActionResult Upload()
{
List<object> fileList;
if (TempData["files"] != null)
{
fileList = (List<object>)TempData["files"];
}
else
{
fileList = new List<object>();
}
if (Request.Files.Count > 0)
{
var file = Request.Files[0];
file.SaveAs(Server.MapPath("/Temp/")+file.FileName);
fileList.Add(file);
TempData.Add("files", fileList);
}
return Json(true);
}
如果我在以上代码里加上 User.Identity ,取出的是一个未获得验证的信息,也就是因为上面 Request的时候获取不到Cookie中验证的信息。
不知道为什么,希望大家帮忙研究下。
顺便问下,在以上Action中的file.SaveAs后,我Session或者TempData保存的值都会丢失,如何解决呢?有什么办法在执行完这个方法后,能在另外一个Action中取到这里我所保存的值(这里需要注意的是,由于是多文件上传,所以这个Upload的Action会有几个文件就执行几次)。有办法的和我分享下吧!
偶认为你应该改变一下程序的架构,定义一个基类BaseController ,在这里面实现验证,然后的别Controller都继承这个基类的,也许能解决此问题
我也遇到同样的问题,不好解决啊。
我一个页面, 页面有模板页,页面有继承自己写的基类用来做登录判断,模板页也有基类做登录判断,页面,模板页都判断登录成功有Cookie值,但是,这个页面中访问另一个页面加载数据的时候,读取数据的那个页面也是继承了基类做了登录判断的,然而,这个页面居然获取到的Cookie值为空,也就是说没有登录,然后就得不到相关的数据了,这个才是头大啊