簡體   English   中英

ASP.NET 內核 Web API 如何使用 try catch 方法捕獲 401 和 403 錯誤

[英]ASP.NET Core Web API how to catch the 401 and 403 errors using the try catch method

我正在使用庫Microsoft.AspNetCore.HttpMicrosoft.AspNetCore.Mvc 我也在使用 Identity 的 JWT 令牌。

當令牌過期時,API 會拋出 http 401 錯誤,如果聲明錯誤,則返回 http 403 錯誤。

我需要能夠捕捉這兩個雕像並將它們包裝成我統一的錯誤消息格式

public class ErrorMessage
{
     public int httpStatus { get; set; }
     public string Header { get; set; } = "Error";
     public string Message { get; set; }
}

我的標准 API 格式

[Authorize]
[HttpPost]
[Route("Logout")]
public async Task<IActionResult> Logout()
{
    try
    {
        ....
    }
    catch (Exception e)
    {
        _logger.LogError($"Error in {nameof(Login)}: {e}");
        return BadRequest(new ErrorMessage { httpStatus = 500, Message = e.Message });
    }
}

根據ASP.NET Core 中的處理錯誤,您可以使用UseStatusCodePages

app.UseStatusCodePages(async statusCodeContext =>
{
    switch (statusCodeContext.HttpContext.Response.StatusCode)
    {
        case 401:
            statusCodeContext.HttpContext.Response.StatusCode = 400;
            await statusCodeContext.HttpContext.Response.WriteAsJsonAsync(new ErrorMessage { httpStatus = 500, Message = "some message" });
            break;
        case 403:
            statusCodeContext.HttpContext.Response.StatusCode = 400;
            await statusCodeContext.HttpContext.Response.WriteAsJsonAsync(new ErrorMessage { httpStatus = 500, Message = "some message" });
            break;
    }
});

您可以通過將以下內容添加到 Startup.cs 中的 Configure 方法來完成此操作

這將讓您攔截和更改響應的各個方面以及內容類型。 在下面的示例中,我們返回一個帶有消息的簡單 JSON object。

app.Use(async (context, next) =>
{
    await next();

    if (context.Response.StatusCode == (int)HttpStatusCode.Unauthorized) // 401
    {
        context.Response.ContentType = "application/json";


        await context.Response.WriteAsync(new { 
            Message = "You must be logged in to access this resource."
        }.ToString());
    }

    if (context.Response.StatusCode == (int)HttpStatusCode.Forbidden) // 403
    {
        context.Response.ContentType = "application/json";

        await context.Response.WriteAsync(new
        {
            Message = "Your claims are incorrect."
        }.ToString());
    }
});

暫無
暫無

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

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