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

时间:2017-07-14 06:10:53

标签: 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.");
     

如何为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();
    }
 }

6 个答案:

答案 0 :(得分:38)

当您希望以HTTP 403状态响应并且允许 ASP.NET核心的身份验证逻辑使用其禁止处理逻辑处理响应时(可以在{{1 }},并且可能导致重定向到另一个页面),使用:

Startup

(同样适用于return Forbid();

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

Unauthorized()

答案 1 :(得分:8)

替代MstfAsan的答案是使用:

return Forbid();

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

或者

return StatusCode(403);

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

答案 2 :(得分:4)

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

public class ForbidResult : ActionResult, IActionResult

有关更多特定用法,请访问https://docs.microsoft.com/en-us/aspnet/core/api/microsoft.aspnetcore.mvc.forbidresult

答案 3 :(得分:3)

您可以简单地使用 ObjectResult 返回带有状态代码的自定义响应。

查看语法,

return new ObjectResult("Message") {StatusCode = YOUR_STATUS_CODE };

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

return new ObjectResult(your_model) {StatusCode = YOUR_STATUS_CODE };

示例:

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

    // return forbidden with custom message
    return new ObjectResult("Forbidden") { StatusCode = 403};
}

答案 4 :(得分:0)

如果您不返回ActionResult进行回复,则可以使用以下代码:

public List<SomeModel> get()
{
   ... 
   ... // check logic
   ...

   Response.StatusCode = 403;
   return new List<SomeModel>();
}

答案 5 :(得分:0)

从 asp net mvc 迁移到 net core 5 时遇到同样的问题。作为决定,您可以从 ObjectResult 继承:

public class ForbidActionResult : ObjectResult
{
    public ForbidActionResult(int statusCode = (int)HttpStatusCode.Forbidden, string errorMessage = null) : 
        base(errorMessage ?? "User is not allowed to enter this page."))
    {
        StatusCode = statusCode;
    }

    public override async Task ExecuteResultAsync(ActionContext context)
    {
        await base.ExecuteResultAsync(context);
    }
}

并将其作为 IActionResult 返回:

[HttpGet]
public IActionResult Get(int bookId)
{
    var book = dbContext.BookRepository.Find(bookId);

    if (!CurrentUser.CanEditAsClient(book))
    {
        return new ForbidActionResult();
    }

    return Ok();
}