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

时间:2015-07-03 11:20:17

标签: c# asp.net-mvc authorization

我有一个MVC webapi网站,它使用OAuth /令牌身份验证来验证请求。所有相关控制器都具有正确的属性,并且身份验证正常。

问题是并非所有请求都可以在属性范围内被授权 - 某些授权检查必须在由控制器方法调用的代码中执行 - 返回401未授权响应的正确方法是什么这个案子?

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

8 个答案:

答案 0 :(得分:110)

您应该从API方法中抛出HttpResponseException,而不是HttpException

throw new HttpResponseException(HttpStatusCode.Unauthorized);

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

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

答案 1 :(得分:72)

只需返回以下内容:

$result = fnmatch('foo.*', $fileName);

答案 2 :(得分:11)

作为其他答案的替代方法,如果要在ASP.NET控制器中返回<Button onPress={()=>this.setState({text:"child"})} title="Update From Child" /> ,也可以使用此代码。

ASP.NET

IActionResult

更新:ASP.NET Core

上面的代码在ASP.NET Core中不起作用,您可以使用以下代码之一:

 return Content(HttpStatusCode.Unauthorized, "My error message");

显然,原因短语非常可选(Can an HTTP response omit the Reason-Phrase?

答案 3 :(得分:7)

你得到一个500响应代码,因为你引发了异常(HttpException),表明某种服务器错误,这是错误的方法。

只需设置响应状态代码.e.g

Response.StatusCode = (int)HttpStatusCode.Unauthorized;

答案 4 :(得分:0)

您可以在asp.net core 2.0中使用以下代码:

public IActionResult index()
{
     return new ContentResult() { Content = "My error message", StatusCode = (int)HttpStatusCode.Unauthorized };
}

答案 5 :(得分:0)

要添加到ASP.NET Core> = 1.0中的现有答案,您可以

return Unauthorized();

return Unauthorized(object value);

要将信息传递给客户,您可以像这样拨打电话:

return Unauthorized(new { Ok = false, Code = Constants.INVALID_CREDENTIALS, ...});

在客户端上,除了401响应之外,您还将拥有传递的数据。例如,在大多数客户上,您可以await response.json()来获取它。

答案 6 :(得分:0)

在.Net Core中,您可以使用

return new ForbidResult();

代替

return Unauthorized();

其优点是重定向到默认的未授权页面(Account / AccessDenied),而不是直接给出401

要更改默认位置,请修改您的startup.cs

services.AddAuthentication(options =>...)
            .AddOpenIdConnect(options =>...)
            .AddCookie(options =>
            {
                options.AccessDeniedPath = "/path/unauthorized";

            })

答案 7 :(得分:0)

您还请遵循以下代码:

var response = new HttpResponseMessage(HttpStatusCode.NotFound)
{
      Content = new StringContent("Users doesn't exist", System.Text.Encoding.UTF8, "text/plain"),
      StatusCode = HttpStatusCode.NotFound
 }
 throw new HttpResponseException(response);