Goa*_*ine 85 c# asp.net-mvc authorization
我有一个MVC webapi站点,它使用OAuth /令牌身份验证来验证请求.所有相关的控制器都具有正确的属性,并且身份验证正常.
问题是并非所有请求都可以在属性范围内被授权 - 某些授权检查必须在由控制器方法调用的代码中执行 - 在这种情况下返回401未授权响应的正确方法是什么?
我试过了throw new HttpException(401, "Unauthorized access");,但是当我这样做时,响应状态代码是500,我也得到了堆栈跟踪.即使在我们的日志记录DelegatingHandler中,我们也可以看到响应是500,而不是401.
Luk*_*keH 125
你应该HttpResponseException从你的API方法中抛出一个,而不是HttpException:
throw new HttpResponseException(HttpStatusCode.Unauthorized);
Run Code Online (Sandbox Code Playgroud)
或者,如果要提供自定义消息:
var msg = new HttpResponseMessage(HttpStatusCode.Unauthorized) { ReasonPhrase = "Oops!!!" };
throw new HttpResponseException(msg);
Run Code Online (Sandbox Code Playgroud)
Joh*_*sby 78
只需返回以下内容:
return Unauthorized();
Run Code Online (Sandbox Code Playgroud)
Ale*_*AIT 16
作为其他答案的替代方法,如果要IActionResult在ASP.NET控制器中返回,也可以使用此代码.
ASP.NET
return Content(HttpStatusCode.Unauthorized, "My error message");
Run Code Online (Sandbox Code Playgroud)
更新:ASP.NET核心
上面的代码在ASP.NET Core中不起作用,您可以使用以下代码之一:
return StatusCode((int)System.Net.HttpStatusCode.Unauthorized, "My error message");
return StatusCode(401, "My error message");
Run Code Online (Sandbox Code Playgroud)
显然,原因短语是非常可选的(HTTP响应可以省略Reason-Phrase吗?)
你得到一个500响应代码,因为你抛出一个异常(HttpException),表明某种服务器错误,这是错误的方法.
只需设置响应状态代码.eg
Response.StatusCode = (int)HttpStatusCode.Unauthorized;
Run Code Online (Sandbox Code Playgroud)
要添加到 ASP.NET Core >= 1.0 中的现有答案,您可以
return Unauthorized();
return Unauthorized(object value);
Run Code Online (Sandbox Code Playgroud)
要将信息传递给客户端,您可以进行如下调用:
return Unauthorized(new { Ok = false, Code = Constants.INVALID_CREDENTIALS, ...});
Run Code Online (Sandbox Code Playgroud)
在客户端上,除了 401 响应之外,您还将获得传递的数据。例如,在大多数客户端上,您可以await response.json()获取它。
在 .Net Core 中你可以使用
return new ForbidResult();
Run Code Online (Sandbox Code Playgroud)
代替
return Unauthorized();
Run Code Online (Sandbox Code Playgroud)
这有利于重定向到默认的未授权页面(Account/AccessDenied),而不是直接给出 401
更改默认位置修改您的startup.cs
services.AddAuthentication(options =>...)
.AddOpenIdConnect(options =>...)
.AddCookie(options =>
{
options.AccessDeniedPath = "/path/unauthorized";
})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
91680 次 |
| 最近记录: |