如何在 ASP.NET 内核中返回403禁止响应作为 IActionResult

我想返回一个403禁止给客户端时,试图执行无效的操作。我需要使用什么方法?

我在网上搜索了一下,但是我只找到了这些 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();
}
}
105057 次浏览

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

public class ForbidResult : ActionResult, IActionResult

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

对于 MstfAsan 的回答,另一种选择是使用:

return Forbid();

它是控制器基类上做同样事情的方法。

或者

return StatusCode(403);

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

当你想用 HTTP 403状态和 允许 ASP.NET Core 的身份验证逻辑来处理响应时,使用:

return Forbid();

(同样适用于 Unauthorized())


当您希望使用来自 API 的 HTTP 403状态代码和 ASP.NET Core 身份验证逻辑 不想来执行任何重定向或其他操作时,请使用:

return StatusCode(403);


// or with developer-friendly type
return StatusCode(StatusCodes.Status403Forbidden);


// or as an api-friendly error response
return Problem(
type: "/docs/errors/forbidden",
title: "Authenticated user is not authorized.",
detail: $"User '{user}' must have the Admin role.",
statusCode: StatusCodes.Status403Forbidden,
instance: HttpContext.Request.Path
);

后一个示例生成一个 客户端错误响应

如果不返回 IActionResult,可以使用以下代码:

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


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

只需使用 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};
}

在从 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();
}