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;