2011-07-28 45 views
52

使用ASP.NET MVC我正在创建一个自定义的Authorize属性来照顾一些自定义的授权逻辑。我看了很多例子,它非常简单,但我的问题是哪个方法最好覆盖AuthorizeCore或OnAuthorization?我看到很多例子都凌驾于其中。有区别吗?扩展AuthorizeAttribute覆盖AuthorizeCore或OnAuthorization

+1

结帐在MVC4,http://aspnetwebstack.codeplex.com/SourceControl/changeset/view/e0115a823029#src%2fSystem.Web.Mvc%2fAuthorizeAttribute.cs – user1736525

回答

71

的线索是在返回类型:

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

Do I want this user to proceed?

它不应该执行“就在身边”的任何其他活动。

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

+1

的源代码谢谢你的信息 –

+14

可惜AuthorizeCore不包含我需要的AuthorizationContext(用于访问RouteData并根据它进行决策),因此我看到的唯一方法是使用OnAuthorize。 – gw0

+4

为什么地球上不是'AuthorizationContext'传递给'AuthorizeCore'?这似乎是一个主要缺陷。 – Jez

15

无论用户是第一次被授权还是在AuthorizeCore中使用缓存授权,您都应该放置任何必须运行的代码。

如果你看看源代码,你可以看到AuthorizeCoreOnAuthorizeOnCacheAuthorization所调用。这允许授权被缓存,但仍然允许某些操作并做出有关授权的实际决策。

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

+0

我希望我可以突出显示答案的最后一句。你真的应该大胆。在接受的答案中提到@ gw0的评论时,真正不幸的是,对错误原因使用错误覆盖的建议已被投票。 –

+3

AuthorizeAttribute(MSDN)的文档清楚地指出(在线程安全下) _“任何实例成员不保证是线程安全的。”因此,我认为持有属性中的信息不是一种选择。 – bvgheluwe

+0

@BartVG - 我不知道我跟着。线程安全与这个讨论有什么关系?所有这些文本的含义是,如果将以多线程方式使用对象,则必须同步对象的访问权限。 –