【发布时间】: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 不返回 Basic 或 Digest。我有其他 Web API 调用,其中响应返回相同的内容,但 Unauthorized 代码未执行两次,并且未显示登录表单。不同的是 withCredentials 没有发送。
【问题讨论】:
标签: c# asp.net authentication asp.net-web-api http-headers