扩展AuthorizeAttribute覆盖AuthorizeCore或OnAuthorization

Nic*_*sen 54 asp.net-mvc authorization action-filter asp.net-mvc-3

使用ASP.NET MVC我正在创建一个自定义Authorize属性来处理一些自定义授权逻辑.我已经看了很多例子,这很简单,但我的问题是哪种方法最好覆盖,AuthorizeCore或OnAuthorization?我见过许多覆盖其中一个的例子.有区别吗?

Bon*_*nyT 77

线索在返回类型中:

AuthorizeCore返回一个布尔值 - 它是决策代码.这应该仅限于查看用户的身份并测试他们所处的角色等.基本上它应该回答这个问题:

Do I want this user to proceed?

它不应该"在一边"执行任何额外的活动.

OnAuthorize返回void - 这是您放置此时需要发生的任何功能的地方.例如,写入日志,在会话中存储一些数据等.

  • 不幸的是,AuthorizeCore不包含我需要的AuthorizationContext(用于访问RouteData并根据它做出决策),因此我看到的唯一方法是使用OnAuthorize. (14认同)
  • 为什么在地球上不是`AuthorizationContext`传递给`AuthorizeCore`?这似乎是一个重大缺陷. (4认同)
  • @ gw0 - 你可以通过传递给`AuthorizeCore`的`HttpContextBase`来访问路由数据:`((MvcHandler)httpContext.Handler).RequestContext.RouteData` (4认同)
  • @Jaz - 从两个地方调用`AuthorizeCore`,一个来自`OnAuthorize`,另一个来自`OnCacheAuthorization`.在后一种情况下,没有`AuthorizationContext`,它必须是线程安全的. (3认同)

Eri*_*sch 17

您应该放置必须运行的任何代码,无论用户是第一次获得授权,还是使用了缓存授权AuthorizeCore.

如果你看一下源代码,你可以看到,AuthorizeCore被双方称为OnAuthorizeOnCacheAuthorization.这允许缓存授权但仍允许某些操作并做出关于授权的实际决策.

如果需要AuthorizationContext中的某些内容,则可以创建一个属性来保存信息,然后在AuthorizeCore方法中访问该信息.

  • AuthorizeAttribute(MSDN)的文档明确指出(在线程安全下)_"任何实例成员都不能保证是线程安全的."_所以我想在属性中保存信息不是一种选择. (3认同)