是否基于ASP.NET核心中的异常返回特定错误?

cgvd09ve  于 2023-01-27  发布在  .NET
关注(0)|答案(3)|浏览(185)

考虑如下的控制器端点:

[HttpGet]
public IActionResult Get()
{
    var resource = _myService.GetSomeResource();
    return Ok(resource);
}

GetSomeResource()方法对调用方的标识执行验证,如下所示:

public SomeResourceModel GetSomeResource()
{
  _securityVerifier.VerifyCallerHasAccess();

  // do stuff to get resource

  return resource;
}

VerifyCallerHasAccess()方法中,假设调用者没有访问他们请求的资源的权限,那么我们抛出一个异常,类似于:

throw new SecurityException($"User does not have access to this resource");

综上所述,我想要的是ASP.NET控制器在遇到这种类型的异常时自动返回一个403。默认情况下,它只是返回一个500。是否有可能为特定类型的异常注册http响应代码?如果有,如何注册?
(Note,我知道我可以将端点代码 Package 在try/catch中,但我不希望必须手动执行此操作)
编辑一些清晰度:我的终结点已经在使用.NET的授权系统。所讨论的安全验证处理获取用户的标识,并检查外部安全服务是否具有对给定安全资源的适当访问权限。

83qze16e

83qze16e1#

您可以在请求管道中使用一些中间件:

public class ErrorHandlingMiddleware
{
    readonly RequestDelegate _next;
    
    public ErrorHandlingMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        try
        {
            await _next(context);
        }
        catch (SecurityException ex)
        {
            context.Response.StatusCode = 403;
        }
        catch (Exception ex)
        {
            context.Response.StatusCode = 500;
            await context.Response.WriteAsync(ex.Message);
        }
    }
}

然后在Program.cs中注册:

app.UseMiddleware<ErrorHandlingMiddleware>();
ztigrdn8

ztigrdn82#

如果可以修改VerifyCallerHasAccess()方法,就可以返回(或设置某些属性)true或false,而不是抛出异常
在控制器中,您可以尝试如下操作:

if (result)            
{                
return Ok();            
}            
else            
{                
return Problem(detail: "User does not have access to the resource", statusCode: 403);                
// you could also try return Forbind() to return a 403 with out  the detail
//check the controllerbase class and you would find more methods related            
    }

如果您坚持抛出异常,那么

var resource = _myService.GetSomeResource();
return Ok(resource)

在try catch块中,使用Forbind()方法或在controllerbase类中找到其他方法返回403

cygmwpex

cygmwpex3#

您可以编写一个异常过滤器(请参见https://learn.microsoft.com/en-us/aspnet/core/mvc/controllers/filters?view=aspnetcore-7.0),或者如果您还想标准化响应,请参见Hellang.Middleware.ProblemDetails

相关问题