如何在ASP.NET Core中将403 Forbidden响应作为IActionResult返回

wan*_*onk 29 c# asp.net-core

我想在尝试执行无效操作时向客户端返回403 Forbidden.我需要使用的方法是什么?

我通过互联网搜索但我发现只有MVC 5:

如果您的web api方法的返回类型是HttpResponseMessage,那么您需要使用以下代码:

return Request.CreateErrorResponse(HttpStatusCode.Forbidden, "RFID is disabled for this site.");
Or  if the return type for your web api method is IHttpActionResult then you need to use the below code

return StatusCode(HttpStatusCode.Forbidden,"RFID is disabled for this site.");
Run Code Online (Sandbox Code Playgroud)

如何为IActionResult类型返回403:

public IActionResult Put(string userid, [FromBody]Setting setting)
 {
    var result = _SettingsRepository.Update(userid, setting);
    if (result == true)
    {
       return Ok(201);
    }
    else
    {
       return BadRequest();
    }
 }
Run Code Online (Sandbox Code Playgroud)

Bar*_*jen 52

当您希望以HTTP 403状态响应并允许 ASP.NET Core的身份验证逻辑使用其禁止处理逻辑处理响应时(可以在您的Startup类中配置,并可能导致重定向到另一个页面),请使用:

return Forbid();
Run Code Online (Sandbox Code Playgroud)

(同样适用于Unauthorized())


如果要使用API​​中的HTTP 403状态代码进行响应,并且不希望 ASP.NET Core身份验证逻辑执行任何重定向或其他操作,请使用:

return StatusCode(403);
Run Code Online (Sandbox Code Playgroud)

  • 实际上有一种比@ MovGP0更简单的方法建议`返回StatusCode(StatusCodes.Status403Forbidden,<you object>);` (8认同)
  • 一点点更清洁的版本是`return StatusCode((int)HttpStatusCode.Forbidden,messageOrSerializeableObject);` (5认同)

juu*_*nas 12

替代MstfAsan的答案是使用:

return Forbid();
Run Code Online (Sandbox Code Playgroud)

它是控制器基类上执行相同操作的方法.

要么

return StatusCode(403);
Run Code Online (Sandbox Code Playgroud)

如果要返回消息,则必须使用StatusCode.

  • 请注意,在ASP.NET Core 2中,返回`ForbidResult`(由`Forbid`返回)将触发与框架的身份验证代码的某种交互,并且 - 如果您没有以框架理解的方式设置身份验证 - 抛出错误*"没有指定authenticationScheme,并且没有找到DefaultChallengeScheme."*如果您不想与ASP.NET Core的auth集成,请坚持返回`StatusCodeResult`以避免此错误. (12认同)
  • 即使我更改了DefaultForbidScheme,在Api控制器中使用Forbid()也会尝试重定向到Acccout/AccessDenied.只有StatusCode(403)似乎正常工作. (7认同)

sha*_*aka 10

您只需使用 ObjectResult 返回带有状态代码的自定义响应即可。

查看语法,

return new ObjectResult("Message") {StatusCode = YOUR_STATUS_CODE };
Run Code Online (Sandbox Code Playgroud)

注意 - 您也可以传递一个对象,

return new ObjectResult(your_model) {StatusCode = YOUR_STATUS_CODE };
Run Code Online (Sandbox Code Playgroud)

例子:

public async Task<IActionResult> Post([FromBody] SomeData _data)
{
     // do your stuff

    // return forbidden with custom message
    return new ObjectResult("Forbidden") { StatusCode = 403};
}
Run Code Online (Sandbox Code Playgroud)


Mst*_*san 5

您可以使用 return new ForbidResult();Class声明为

public class ForbidResult : ActionResult, IActionResult
Run Code Online (Sandbox Code Playgroud)

有关更多特殊用途,请访问https://docs.microsoft.com/zh-cn/aspnet/core/api/microsoft.aspnetcore.mvc.forbidresult

  • 有趣的是,ForbidResult 并不继承自 StatusCodeResult,至少在 ASP NET CORE 2.2 中是这样。 (2认同)