withCredentials导致Web API Auth被称为两次

时间:2018-02-15 15:32:52

标签: c# asp.net authentication asp.net-web-api http-headers

我遇到的问题是当我将withCredentials: true发送到我的Web API并返回Unauthorized时,再次调用该函数,然后返回浏览器登录表单。我只想让函数运行一次,返回简单的401

例如,在我的控制器中:

[Route("search")]
[HttpGet]
public async Task<IHttpActionResult> GetDeposit([FromUri] DepositSearchFilter filter)
{
    return Unauthorized();
}

如果我设置断点,则return Unauthorized()执行两次,第二次执行后,浏览器显示登录表单。 但是,如果我用Forbidden()替换Unauthorized,那么该函数只运行一次并返回。

此外,我创建了自己的AuthorizeAttribute来处理在cookie中发送的身份验证令牌。当我添加标题[ValidateToken]时,同样的事情发生在自定义属性内部。如果我返回Unauthorized(),则再次调用OnAuthorization,浏览器会显示登录表单。但是如果我在自定义属性中返回Forbidden它会运行一次。

public class ValidateToken : AuthorizeAttribute
{
    public override void OnAuthorization(HttpActionContext actionContext)
    {
        CookieHeaderValue headers = actionContext.Request.Headers.GetCookies().FirstOrDefault();

        CookieState authCookie = headers.Cookies.Where(p => p.Name == "AUTH-TOKEN").FirstOrDefault();

        actionContext.Request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", authCookie.Value);

        base.OnAuthorization(actionContext);
        //if (!base.IsAuthorized(actionContext))
        //{
        //    HandleUnauthorizedRequest(actionContext);
        //}
    }

    //protected override void HandleUnauthorizedRequest(HttpActionContext actionContext)
    //{
        //actionContext.Response = actionContext.ControllerContext.Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "Unauthorized");
    //}
}

因此,当我发送withCredentials时,任何返回Unauthorized的代码都会运行两次,然后会显示浏览器中的登录表单。我需要代码才能运行一次并返回401。

对于显示的浏览器登录表单,我将返回401

WWW-Authenticate:Bearer
WWW-Authenticate:NTLM
WWW-Authenticate:Negotiate

Web API不会返回BasicDigest。我有其他Web API调用,其中响应返回相同的内容,但Unauthorized代码不执行两次,并且不显示登录表单。 withCredentials 的差异不会发送。

1 个答案:

答案 0 :(得分:0)

确保匿名身份验证 已启用 Windows身份验证 已禁用。这应该删除NTLMNegotiate

<IISExpressAnonymousAuthentication>enabled</IISExpressAnonymousAuthentication>
<IISExpressWindowsAuthentication>disabled</IISExpressWindowsAuthentication>