对WCF服务认证的AJAX请求



如果有人能帮助我,我将不胜感激。目前,我正在我们的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请求)都不会被接受。

最新更新