簡體   English   中英

如何在 ASP.NET Core 中返回 403 Forbidden 響應作為 IActionResult

[英]How to return 403 Forbidden response as IActionResult in 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(); } }

當您想要響應 HTTP 403 狀態並允許ASP.NET Core 的身份驗證邏輯使用其禁止的處理邏輯來處理響應時(可以在您的Startup類中配置,並且可能導致重定向到另一個頁面),請使用:

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
);

后一個示例產生客戶端錯誤響應

MstfAsan 的答案的替代方法是使用:

return Forbid();

它是控制器基類上的一個方法,它做同樣的事情。

要么

return StatusCode(403);

如果要返回消息,則必須使用StatusCode

您可以使用return new ForbidResult(); 類聲明是

public class ForbidResult : ActionResult, IActionResult

有關更多具體用法,請訪問https://learn.microsoft.com/en-us/aspnet/core/api/microsoft.aspnetcore.mvc.forbidresult

您可以簡單地使用 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};
}

如果您不返回IActionResult作為結果,您可以使用以下代碼:

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

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM