ASP.NET Web API:正确的方式返回401 /未授权的响应

我有一个MVC webapi网站,使用OAuth /令牌authentication来validation请求。 所有相关的控制器都有正确的属性,authentication工作正常。

问题是并不是所有的请求都可以在属性范围内进行授权 – 一些授权检查必须在由控制器方法调用的代码中执行 – 在这种情况下返回401未授权响应的正确方法是什么?

我曾尝试throw new HttpException(401, "Unauthorized access"); ,但是当我这样做时,响应状态码是500,我也得到一个堆栈跟踪。 即使在我们的日志DelegatingHandler中,我们也可以看到响应是500,而不是401。

你应该从你的API方法抛出一个HttpResponseException ,而不是HttpException

 throw new HttpResponseException(HttpStatusCode.Unauthorized); 

或者,如果您想提供自定义消息:

 var msg = new HttpResponseMessage(HttpStatusCode.Unauthorized) { ReasonPhrase = "Oops!!!" }; throw new HttpResponseException(msg); 

只需返回以下内容:

 return Unauthorized(); 

你得到一个500响应代码,因为你正在抛出一个exception( HttpException ),它指出某种服务器错误,这是错误的方法。

只需设置响应状态代码

 Response.StatusCode = (int)HttpStatusCode.Unauthorized;