【问题标题】:withCredentials Causing Web API Auth To Be Called TwicewithCredentials 导致 Web API Auth 被调用两次
【发布时间】:2018-07-26 10:06:40
【问题描述】:

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

例如,在我的控制器中:

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

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

此外,我创建了自己的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 没有发送。

【问题讨论】:

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


    【解决方案1】:

    确保匿名身份验证启用并且Windows身份验证禁用。那应该删除 NTLMNegotiate

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-12
      • 2017-02-16
      • 2012-03-03
      • 2019-08-19
      • 2019-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多