单页网页,Asp.net MVC和身份验证

时间:2014-09-22 21:40:38

标签: jquery asp.net-mvc authentication

我熟悉窗体身份验证如何与ASP.NET MVC一起使用;这不是太困难。但我有点不确定身份验证如何与单页Web应用程序一起使用。当然我可以使用单页应用程序处理初始登录,因为会有回发,我可以进行标准表单身份验证。但之后我将使用ajax访问更多网页内容。

我的想法是实现一个间隔函数,Jquery每20分钟左右触发一次,这会要求密码重新进行身份验证。为asp.net MVC单页Web应用程序进行身份验证的“最佳实践”是什么?

1 个答案:

答案 0 :(得分:2)

您也可以使用表单身份验证。 ajax请求通过与完整页面postabacks相同的管道,因为它们只是具有不同内容类型和有效负载的普通HTTP请求。因此,一旦您对用户进行身份验证并创建了身份验证cookie,它就会在服务器上传输。因此,服务器将以标准方式检查它。您需要处理的唯一事情是重定向到未经过身份验证的用户的登录页面。您可以在客户端处理此问题(默认情况下,http重定向不受XHR请求处理,但您可以编写自定义代码来处理它们)。返回ajax请求的401 http状态代码:

    public class AuthorizeAjaxAttribute : AuthorizeAttribute
    {    
        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest() &&
                // angular.js requests
                filterContext.RequestContext.HttpContext.Request.ContentType == "application/json" ||
                filterContext.RequestContext.HttpContext.Request.ContentType == "application/xml" ||
               )
            {
                // ajax request returns HTTP 401 (Unauthorized) status code
                filterContext.Result = new Http401Result();
            }
            else
            {
                // standard behavior - redirect to login page
                base.HandleUnauthorizedRequest(filterContext);
            }
        }
    }

然后在客户端处理它(取决于您的客户端框架):

$(document).ajaxError(function (event, jqxhr, settings, exception) {
    if (jqxhr.status == 401) { //Forbidden, go to login
        //Use a reload, WIF will redirect to Login
        location.url = "/Account/Login";
    }
});