本文不具体去演示Ajax中怎么结合Forms身份验证,只是讲解一个思路,希望能起到画龙点睛作用。
致力于Web开发的程序员对Ajax这个词是再熟悉不过了,同样致力于Asp.Net开发的程序员对Forms验证的应用也很熟悉。怎样在Ajax中应用Forms验证,你是否有自己的一套解决方法?
首先我们必须要对Ajax和Forms验证这两个技术的实现机制有一定的了解,而不是单纯的停留在应用的层面。因为做为一个.NET程序员很容易陷入一个拖控件,找控件思维模式,要想成为一名出色的Web程序员,停留在这样一个思维模式是很可怕的。废话不多说,下面就去介绍一下我的思路。
1.XMLHttpRequest无论是Get还是Post向Server端发送请求时都携带了一个URL,有了这个URL和其他Data,我们在Server端就能做出相应的处理,然后返回给Client端。
2.Forms验证,我们在Webconfig中对Server端的不同目录进行了Role和User授权,以达到我们的权限控制。
一.这里我们重点关心的就是Ajax请求的URL和Forms中的目录,或许你已经知道我要做什么了,那就是在Webconfig中对Ajax请求的URL进行配置。是的,接下来我们就去配置。
二.配置结束后我们经过测试,当Ajax向Server端发送请求时,用户身份过期/没有通过身份验证的情况下浏览器的页面并没有跳转到登陆页面。问题就出在XMLHttpRequest的身上,它并不接受我们在服务器端进行页面跳转然后做出回应。
三.这种情况下,就要在Asp.Net的请求管道上做点什么了。我们可以在global.asax 文件中或者自定义HttpModule进行处理。当我们截取到是一个Ajax请求时,而且没有通过身份验证时,我们就给XMLHttpRequest返回一个通知,通知它要跳转页面了。然后在Client端得到这个通知时,通过JS去实现跳转。
以上三步就是Ajax中应用Forms验证的一个思路,下面贴上简易的代码,我在HttpApplication的AuthenticateRequest事件中对Ajax的请求进行了处理,以达到Forms验证。
void context_AuthenticateRequest(object sender, EventArgs e)
{
HttpApplication app = (HttpApplication)sender;
HttpContext context = app.Context;
//当没有通过身份验证时,Forms验证机制都会让请求跳转到登陆页面,这时候就要进行处理了
if (!String.IsNullOrEmpty(context.Request.Params["ReturnUrl"]) && context.Request.RawUrl.StartsWith("/Login.html?"))
{
string loginUrl = String.Empty;
string returnUrl = context.Request.Params["ReturnUrl"];
//是否要进行跳转的标识
bool isRedirect = true;
if (returnUrl.EndsWith(".aj", StringComparison.OrdinalIgnoreCase))
{
//当检测到是Ajax请求时,不让页面去跳转,而是返回给Client一个跳转的URL
isRedirect = false;
returnUrl = returnUrl.Substring(0, returnUrl.LastIndexOf("/")) + ".html";
}
loginUrl = String.Format("{0}?ReturnUrl={1}", loginUrl, HttpUtility.UrlEncode(returnUrl));
//结束本次的请求
app.CompleteRequest();
if (!isRedirect)//Ajax请求
{
context.Response.ContentType = "text/xml";
context.Response.ContentEncoding = System.Text.Encoding.UTF8;
context.Response.Write("ResponseRedirect:" + loginUrl);
}
else//非Ajax请求,跳转页面
context.Response.Redirect(loginUrl);
}
}