我想在尝试执行无效操作时向客户端返回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(); } }
答案 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();
}