6

我们有一个完全在 AngularJS 上运行的网站,其 ASP.NET Web API 后端具有以下配置: - 在 Angular 上启用了 HTML5 路由,并且在 web.config 中有一个重写规则将所有流量定向到 index.html -未安装 MVC(仅 razor 页面)- 使用表单身份验证和相关 cookie 进行身份验证

我刚刚添加了 Helicon IIS 插件,为我们的开发服务器提供 .htaccess 密码保护(单独使用 IIS 很麻烦),但我有一个基本问题。

在我输入基本身份验证凭据后,我将获得一个重定向/login.aspx?ReturnUrl=,尽管我不确定谁对此负责(IIS 或 Helicon 插件),但它会匹配我的 AngularJS 路由之一并导致错误。

如何阻止此重定向发生?

我的 web.config 身份验证位:

<authentication mode="Forms">
  <forms protection="All" timeout="15" name=".ASPXAUTH" path="/" requireSSL="false" slidingExpiration="false" cookieless="UseCookies" enableCrossAppRedirects="false" />
</authentication>
4

2 回答 2

18

如果您使用的是 ASP.NET 4.5。您可以禁用表单身份验证重定向 HttpResponse.SuppressFormsAuthenticationRedirect 属性。

在 Global.asax 中:

protected void Application_BeginRequest(Object sender, EventArgs e)
{
        HttpApplication context = (HttpApplication)sender;
        context.Response.SuppressFormsAuthenticationRedirect = true;
}
于 2013-08-29T19:45:01.597 回答
9

总之,我把它放在 global.asax

protected void Application_BeginRequest(object sender, EventArgs e)
{
    var context = new HttpContextWrapper(Context);
    // set flag only if forms auth enabled and request comes from ajax
    if (FormsAuthentication.IsEnabled && context.Request.IsAjaxRequest())
    {
        context.Response.SuppressFormsAuthenticationRedirect = true;
    }
}

IsAjaxRequest()用于此

public static bool IsAjaxRequest(this HttpRequestBase request)
{
    if (request == null)
    {
        throw new ArgumentNullException("request");
    }
    var context = HttpContext.Current;
    var isCallbackRequest = false;// callback requests are ajax requests
    if (context != null && context.CurrentHandler is Page)
    {
        isCallbackRequest = ((Page)context.CurrentHandler).IsCallback;
    }
    return isCallbackRequest || request["X-Requested-With"] == "XMLHttpRequest" || 
        request.Headers["X-Requested-With"] == "XMLHttpRequest";
}

因此对于每个 ajax 请求表单,auth 将不再被重定向。这是我找到的最好的解决方案。

并且可以选择将其放入客户端代码中,以便在收到 401 错误答案后重新加载页面。

$(document).ajaxError(function (xhr, props) {
    if (props.status === 401) {
        location.reload();
    }
});
于 2015-09-04T07:49:17.357 回答