没有[Authorize]属性,HandleAuthenticateAsync仍然被调用

4
我正在使用自定义的AuthenticationHandler,但只有一些控制器方法具有[Authorize]属性。我记录了Info级别,它会为任何方法调用创建日志条目。现在我无法区分是否确实有人尝试访问需要授权的方法并失败,还是调用不需要授权的方法并因为应该失败而失败。
有没有办法区分它们,或者更好的是如何防止MVC在不需要时调用HandleAuthenticateAsync

我也遇到了同样的问题,你具体是怎么解决的? - Satinder singh
@Satindersingh 看看身份验证和授权的区别。我不得不转向授权,因为我所做的更多是授权而不是身份验证。 - lenny
1
有点晚了。但我通过在HandleAuthenticateAsynce的开头添加检查来解决了这个问题。 var endpoint = Context.GetEndPoint(); if(endpoint.Metadata.GetMetadata<IAllowAnonymouse()!=null || endpoint.Metadata.GetMetadata<IAuthorizeData>() = null) { return AuthenticateResult.NoResult(); }思路是如果存在AllowAnonymous或没有Authorize属性,则立即返回No result。 - Kamran Asim
1个回答

4

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

除非你有意拒绝未经身份验证的用户访问,否则你只应该对其进行身份验证或将其作为匿名用户传递。在某个时刻,AuthorizeAttribute将会启动并检查用户是否有权访问所请求的资源。如果他未经身份验证,授权将拒绝请求。


只是为了明确,技术上“控制器”有“[Authorize]”,而某些方法有“[AllowAnonymous]”。如果调用带有“[AllowAnonymous]”的方法,它可以正常工作,但对于每个调用,我都会收到一个日志消息告诉我身份验证失败。 - lenny
@lennyy 但这是期望的行为,因为身份验证是在MVC启动之前执行的,也就是说,在任何控制器被创建和授权属性被处理之前。 - Imantas
天啊,我刚刚才注意到我正在使用“AUTHENTICATIONHandler”……是否有“AuthorizationHandler”这样的东西? - lenny
@lennyy 从技术上讲,处理程序并不适合这种情况,因为授权是在所有处理程序完全完成并创建MVC上下文之后进行的。您应该使用过滤器来实现此目的。 - Imantas
@lenny 是的,有一个 AuthorizationHandler 类。你可以在这个链接中了解更多信息:https://learn.microsoft.com/zh-cn/dotnet/api/microsoft.aspnetcore.authorization.authorizationhandler-1?view=aspnetcore-7.0 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接