Asp.net core 如何在每个控制器方法中强制执行授权检查?
我正在我的web API中实现 我想强制程序员在每个控制器方法中始终调用Asp.net core 如何在每个控制器方法中强制执行授权检查?,asp.net-core,asp.net-core-mvc,authorization,Asp.net Core,Asp.net Core Mvc,Authorization,我正在我的web API中实现 我想强制程序员在每个控制器方法中始终调用\u authorizationService.authorizationasync 如果某个控制器方法在没有至少调用一次AuthorizeAsync的情况下完成,如何确保返回403未经授权的响应? 我也可以考虑一种属性或其他方式来显式地标记一个控制器方法,而不必授权。其主要思想是应用“拒绝所有,然后允许一些”的原则,并防止仅仅因为有人忘记添加AuthorizeAsync调用而出现安全漏洞。发明了一种使用动作过滤器的快速而肮
\u authorizationService.authorizationasync
如果某个控制器方法在没有至少调用一次AuthorizeAsync
的情况下完成,如何确保返回403未经授权的响应?
<>我也可以考虑一种属性或其他方式来显式地标记一个控制器方法,而不必授权。其主要思想是应用“拒绝所有,然后允许一些”的原则,并防止仅仅因为有人忘记添加
AuthorizeAsync
调用而出现安全漏洞。发明了一种使用动作过滤器的快速而肮脏的解决方案。我执行以下内部HandleRequirementAsync操作:
// add a flag to the context about the fact that authorization has been attempted
// so that our custom ActionFilter can fail if programmer forgets to call authorization
// on methods that are not explicitly marked with [AllowUnauthorized] attribute
var httpContext = _httpContextAccessor.HttpContext;
httpContext.Items.Add(AuthAttemptedMark, true);
我的处理程序还有一个helper函数,用于确定是否已调用它:
public bool HasAuthorizationBeenAttemptedForRequest()
{
var httpContext = _httpContextAccessor.HttpContext;
return httpContext.Items.ContainsKey(AuthAttemptedMark) &&
(bool)httpContext.Items[AuthAttemptedMark];
}
然后我有一个过滤器:
公共类RequestAuthorizationAttemptGuardFilter:IActionFilter
{
CrudResourceAuthorizationUserClaimHandler\u authHandler
public RequestAuthorizationAttemptGuardFilter(CrudResourceAuthorizationUserClaimHandler authHandler)
{
_authHandler = authHandler;
}
public void OnActionExecuting(ActionExecutingContext context)
{ }
public void OnActionExecuted(ActionExecutedContext context)
{
// if the action did not have any authorization attempts
// and was not marked as explicitly allowed,
// then return forbidden
if (!_authHandler.HasAuthorizationBeenAttemptedForRequest())
context.Result = new ForbidResult();
}
}
因此,如果我检测到一个程序员懒惰并且忘记添加至少一个对授权服务的调用,那么结果将被替换为
403禁止。在应用程序中编码特定行为以防止编码实践非常奇怪。为什么不使用静态代码分析,比如SonarQube和creat使用自定义规则执行此操作?为什么要在操作方法中执行身份验证?只需使用[Authorize]
(或您自己的派生版本)你可以强制在你的应用程序中应用。如果这是适用于所有路由的一般授权要求,那么你应该调整默认策略以满足该要求,以便在使用[Authorize]时自动执行
。否则,您可以始终添加MVC授权筛选器。@DavidG我无法使用[Authorize],因为它不支持我所需的用例(引用Microsoft文章:“如果您根据CRUD(创建、读取、更新、删除)操作的结果做出决策”…)。在这种情况下,基于资源的授权似乎是我在任何资源上应用通用CRUD auth规则的最佳选择。好主意,谢谢。唯一的缺点是,它是团队中每个开发人员都必须了解并知道如何正确配置和使用的又一个工具。