如果有人能帮助我,我将不胜感激。目前,我正在我们的ASP实现一些jQuery AJAX方法。NET应用程序来获取和POST数据到我们的服务器。我们希望在这上面有某种形式的身份验证,它是轻量级的,并且可以相当快地实现。
目前,对于每个AJAX请求,它都会发送表单认证cookie到我们的WCF服务,就像在Fiddler上看到的那样。当我们接收到对WCF服务的请求时,它有一个解密Forms Authentication cookie的方法。目前,它只会在cookie不为空且未过期的情况下给出数据响应。这工作得很好,并且cookie存在的唯一方式是用户通过了我们的安全登录系统。
我想知道的是,这是否是一种有效的形式,尽管是基本的,保护我们的AJAX调用。
模仿表单cookie容易吗?是否有可能绕过表单cookie?如果你能给我一些建议,我将不胜感激,因为我对这方面有点力不从心。
编辑:我们目前也启用了SSL和安全HTTPS传输。
下面是我们的代码示例:private bool AuthenticateAJAXRequest()
{
// assume user is not authenticated
bool authenticated = false;
if (HttpContext.Current != null)
{
if (HttpContext.Current.Request != null)
{
var authCookie = HttpContext.Current.Request.Cookies["authCookie"];
if (authCookie != null)
{
FormsAuthenticationTicket fTicket = FormsAuthentication.Decrypt(authCookie.Value);
if (fTicket != null)
{
if (!fTicket.Expired)
authenticated = true;
}
}
}
}
return authenticated;
}
首先,AJAX (XHR - Xml Http Request)异步请求受"同源"策略的约束。这意味着浏览器将隐式地拒绝/限制对页面源服务器以外的服务器进行AJAX调用。这可以防止跨域脚本攻击。(您仍然可以使用JSONp或手动使用脚本标记进行跨域异步调用,但这完全是另一回事,不在当前讨论的范围内。)据我所知,如果你只是检查cookie而没有后退,那么你就会遇到麻烦,因为一些用户可能已经在浏览器中关闭了cookie。相反,我建议使用用户级别的唯一id,您可以为每个用户会话存储和检索。将此唯一id作为每个Ajax请求的一部分发送,并根据服务器上的数据存储(缓存或持久化)对其进行验证。这样,您就可以放心,无论cookie如何,该系统仍将工作。还要确保在用户注销后销毁唯一id,这样以后的任何请求(无论是完整页面请求还是Ajax请求)都不会被接受。