【问题标题】:HandleAuthenticateAsync called even without [Authorize] attribute即使没有 [Authorize] 属性也会调用 HandleAuthenticateAsync
【发布时间】:2019-01-18 14:30:21
【问题描述】:

我正在使用自定义 AuthenticationHandler,并且只有一些控制器方法具有 [Authorize] 属性。我登录 Info 级别,它会为 any 方法调用创建一个日志条目。现在我无法区分是否有人真的尝试访问需要授权的方法但失败了,或者它是否是对甚至不需要授权的方法的调用并且它失败了,因为它应该这样做。

有没有办法将它们区分开来,或者最好阻止 MVC 在不需要时调用 HandleAuthenticateAsync

【问题讨论】:

  • 我也面临同样的问题,那么究竟什么对你有用。
  • @Satindersingh 看一下Authentication和Authorization的区别。我不得不切换到授权,因为我所做的更多的是授权而不是身份验证。
  • 有点晚了。但我通过在 HandleAuthenticateAsynce var endpoint= Context.GetEndPoint(); 开头添加检查解决了这个问题if(endpoint.Metadata.GetMetadata() = null) { return AuthenticateResult.NoResult();如果有 AllowAnonymous 或没有 Authorize 属性,想法是立即返回 No result

标签: c# asp.net-core-mvc authorize-attribute


【解决方案1】:

听起来您可能误用了AuthenticationHandler。如果用户未能通过身份验证,您不应立即拒绝访问。如果这样做,它甚至不会到达管道中的 MVC 上下文。

除非您有意拒绝未经身份验证的用户的任何访问,否则您应该只进行身份验证或作为匿名用户通过。之后,AuthorizeAttribute 会在某个时候启动并检查用户是否有权访问所请求的资源。如果他未通过身份验证,授权将拒绝该请求。

【讨论】:

  • 要明确一点,技术上Controllers 有[Authorize],有些方法有[AllowAnonymous]。如果一个带有[AllowAnonymous] 的方法被调用,它工作得很好,但每次调用我都会收到一条日志消息,告诉我身份验证失败。
  • @lennyy 但这是所需的行为,因为身份验证是在 MVC 启动之前执行的,也就是说,在创建任何控制器和处理授权属性之前。
  • 天哪,我刚刚注意到我正在使用AUTHENTICATIONHandler... 有AuthorizationHandler 这样的东西吗?
  • @lennyy 从技术上讲,处理程序不适合这种情况,因为授权是在所有处理程序完全完成并创建 MVC 上下文之后完成的。您应该为此目的使用filters
猜你喜欢
  • 1970-01-01
  • 2012-07-18
  • 1970-01-01
  • 2021-01-17
  • 2020-10-18
  • 2020-10-04
  • 1970-01-01
  • 2018-11-20
  • 2018-02-09
相关资源
最近更新 更多