代码之家  ›  专栏  ›  技术社区  ›  Matt Smith

在ajax表单发布之前检查mvc中的http授权

  •  5
  • Matt Smith  · 技术社区  · 17 年前

    在构建将jQueryAjax集成到GUI中的内容管理系统时,我遇到了一个障碍。似乎有些客户花了太长时间考虑他们将要写什么,因此服务器会话会将他们注销,当然是他们不知道的web。当他们试图提交更改时,我使用ajax调用服务器来保存数据。

    接下来,我希望MVC服务器应用程序返回“401unauthorized”状态。然后,我可以让jquery ajax对象要求用户登录,然后在用户获得授权后重新发送更改。

    然而,MVC应用程序实际返回的是“302已找到”状态和指向我的登录表单页面的重定向URL。登录表单页面返回一个“200OK”状态代码,jQueryAjax对象调用成功事件,告诉用户一切都成功了,因为MVC应用程序就是这么说的。

    有没有办法让MVC应用程序按照我认为应该的方式运行,或者我必须修改jQueryAjax事件来检测登录页面?

    更新:

    我已经使用reflector查看了MVC代码和authorize属性,返回NotAuthorizedResult,代码如下(0x191=401)

    public override void ExecuteResult(ControllerContext context)  
    {  
        if (context == null)  
        {  
            throw new ArgumentNullException("context");  
        }  
        context.HttpContext.Response.StatusCode = 0x191;  
    }
    

    我想也许表单授权HttpModule看到了401并强制重定向。

    3 回复  |  直到 16 年前
        1
  •  6
  •   Simon Farrow    17 年前

    您可以尝试以下方法:

        void context_EndRequest(object sender, EventArgs e)
        {
            var app = sender as HttpApplication;
            var response = app.Response;
            var request = app.Request;
    
            if ((response.StatusCode == 302) && IsAjaxRequest(request))
                response.StatusCode = 401;
        }
    

    在HttpModule中,它将依次位于FormsAuth模块之后,因此将更正状态代码。不漂亮但有效。

        2
  •  5
  •   user342706 user342706    15 年前

    Global.asax:

    protected void Application_EndRequest()
    {
        if (Context.Response.StatusCode == 302 &&
            Context.Request.Headers["X-Requested-With"] == "XMLHttpRequest")
        {
            Context.Response.Clear();
            Context.Response.StatusCode = 401;
        }
    }
    

     $(function () {
          $.ajaxSetup({
            statusCode: {
              401: function () {
                location.href = '/Logon.aspx?ReturnUrl=' + location.pathname;
              }
            }
          });
        });
    
        3
  •  1
  •   Uffe Friis Lichtenberg    14 年前

    我发现一种更轻量级的方法是简单地向登录页面添加一个自定义HTTP头,然后在AJAX成功回调中检查是否存在该头。

    例如,在LoginController中(这是一个MVC项目,但相同的原则应适用于其他ASP.NET解决方案):

    public ActionResult Login(string returnUrl = "")
    {
        Response.AddHeader("X-Unauthorized", "true");
        ...
    

    然后在客户端AJAX处理程序中:

    success: function(data, textStatus, jqXhr)
    {
        if (jqXhr.getResponseHeader("X-Unauthorized"))
        {
            ...
    

    这至少对我有用。