1

对于我们的新应用程序,我们正在从 MVC 3 切换到 MVC 4。我们使用 Ajax 从服务器获取大部分内容在 MVC 3 中,我们在 web.config 中有以下内容:

    <authentication mode="Forms">
        <forms

            defaultUrl="Home/Index"
            protection ="All"
            slidingExpiration="true"
        />
    </authentication>

如果用户点击 [Authorize] 属性,则 ajax 调用将失败并出现“未经授权”错误。

    $.getJSON(
            url,function (data) {processAjaxCallResult(data);}
       )
       .fail(
             function (xhr, status, error)
             { handleAjaxCallError(xhr, status, error); }
       )
       .done(
             function () {completedAjaxCall();}
       );

然后,“handleAjaxCallError”将拾取错误,并确保用户被引导到正确的 MVC 操作以登录

在具有相同 web.config 的新 MVC 4 中,应用程序尝试转到 login.aspx。这不是应用程序的一部分。将服务器重定向到这个不存在的页面会导致客户端停止使用内部服务器错误,从而破坏应用程序

如何找回我的“未经授权”错误?

更新

按照 Josh 的建议,我添加了对 HandleUnauthorizedRequest 的覆盖,如下所示:

    protected override void HandleUnauthorizedRequest(AuthorizationContext context)
    {
        if ((context.RequestContext.HttpContext.Request.Headers)["X-Requested-With"] ==
            "XMLHttpRequest")
        {
            context.RequestContext.HttpContext.Response.StatusCode = 403;
        }
     }

这会导致“禁止”错误,我可以像在旧情况下处理 401 一样处理该错误。但是,设置 401仍会导致重定向到不存在的登录页面。

好吧,现在我让我的申请回到正轨,所以乔希是我的观点......

4

1 回答 1

1

您可以编写自己的从 AuthorizeAttribute 类继承的授权属性:

public class CustomAuthorizeAttribute : AuthorizeAttribute

在其中,您可以覆盖 HandleUnauthroziedRequest:

protected virtual void HandleUnauthorizedRequest(AuthorizationContext filterContext){
    // Return to JSON instead of following the authenticate route
}

使用自定义属性需要您做一些工作,但允许您完全自定义授权过程。

于 2013-05-30T15:46:21.857 回答