考虑如下的控制器端点:
[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的授权系统。所讨论的安全验证处理获取用户的标识,并检查外部安全服务是否具有对给定安全资源的适当访问权限。
3条答案
按热度按时间83qze16e1#
您可以在请求管道中使用一些中间件:
然后在Program.cs中注册:
ztigrdn82#
如果可以修改
VerifyCallerHasAccess()
方法,就可以返回(或设置某些属性)true或false,而不是抛出异常在控制器中,您可以尝试如下操作:
如果您坚持抛出异常,那么
在try catch块中,使用Forbind()方法或在controllerbase类中找到其他方法返回403
cygmwpex3#
您可以编写一个异常过滤器(请参见https://learn.microsoft.com/en-us/aspnet/core/mvc/controllers/filters?view=aspnetcore-7.0),或者如果您还想标准化响应,请参见Hellang.Middleware.ProblemDetails