我遇到的问题是当我将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不会返回Basic
或Digest
。我有其他Web API调用,其中响应返回相同的内容,但Unauthorized
代码不执行两次,并且不显示登录表单。 withCredentials
的差异不会发送。
答案 0 :(得分:0)
确保匿名身份验证 已启用且 Windows身份验证 已禁用。这应该删除NTLM
和Negotiate
<IISExpressAnonymousAuthentication>enabled</IISExpressAnonymousAuthentication>
<IISExpressWindowsAuthentication>disabled</IISExpressWindowsAuthentication>