我有一个MVC webapi网站,它使用OAuth /令牌身份验证来验证请求。所有相关控制器都具有正确的属性,并且身份验证正常。
问题是并非所有请求都可以在属性范围内被授权 - 某些授权检查必须在由控制器方法调用的代码中执行 - 返回401未授权响应的正确方法是什么这个案子?
我尝试了throw new HttpException(401, "Unauthorized access");
,但是当我这样做时,响应状态代码为500,我也得到了堆栈跟踪。即使在我们的日志记录DelegatingHandler中,我们也可以看到响应是500,而不是401.
答案 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);