asp.net-mvc – 关于使用重写的AuthorizeAttribute,线程安全,Chi
因此,在为我的MVC3应用程序搜索强大的安全解决方案后,Rick Anderson发现了
this blog post.它详细介绍了一个WhiteList方法,其中AuthorizeAttribute的自定义实现被应用为全局过滤器,并且您装饰要允许的操作/控制器匿名访问使用虚拟属性AllowAnonymousAttribute(我说虚拟因为AllowAnonymousAttribute中没有逻辑,它是只是一个空属性类)
bool allowAnnonymous = filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute),true) || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute),true); if (allowAnnonymous) return; 这一点(以及HTTPS等博客提到的其他安全建议)给了我一个安全的默认模式,因此我不必对每一个动作应用安全检查,并且还要将其添加到未来的功能添加中. 问题的第一部分 现在,我没有在AuthorizeAttribute上使用Users / Roles属性,我需要从数据库中获取该东西.对我而言,这是在AuthorizeCore中的东西,因为唯一的责任是返回一个真假,用户是否可以访问.但是我有一个问题,AuthorizeCore必须是线程安全的,因为我读取了AuthorizeAttribute类的源代码,我不知道访问我的数据库以确定用户权限并坚持下去的最佳方式.我的应用程序正在使用IoC,目前让我的IoC容器将我的存储库注入到AuthorizeAttribute的构造函数中,但是通过这样做然后在AuthorizeCore中访问它,我没有引起线程安全问题?或者我将使用IoC实现和MVC3 DependencyResolver来为我的自定义AuthorizeAttribute构造函数提供参数,以充分处理线程安全性?请注意,我的存储库正在使用一个UnitOfWork模式,其中包括我的nHibernate SessionFactory作为存储库的构造,并且Unit of Work类是从我的IoC容器提供的,由StructureMap使用下面的行实现,我正在考虑这里使用的范围会处理线程问题吗? For<IUnitOfWork>().HybridHttpOrThreadLocalScoped().Use<UnitOfWork>(); 问题的第二部分 我的数据模型(因此安全模型)被设置,使得我的主业务对象都被定义为这样一种方式,它是一个大的层次结构模型,当我检查权限时,我会看到该层次结构模型中用户帐户的位置默认情况下定义并授予对其下的所有内容的访问权限. bool bypassChildAction = filterContext.ActionDescriptor.IsDefined(typeof (ChildActionOnlyAttribute),true) || filterContext.IsChildAction; if (bypassChildAction) return; 这样做是否有意义,如果是/否,为什么?在我看来,如果Action采用ChildActionOnlyAttribute进行装饰,那么它无论如何都是通过URL公开访问的.如果它是作为子动作执行,但并不完全是子操作,那么我可以绕过安全检查,因为这个执行是由于父操作将处理权限.你会有一种情况,你需要限制访问一个小孩的行动?知道子操作通常是非常小的部分视图,我不会预料到这是一个问题,但是我也看到在OnAuthorization的默认实现中引用了一行,概述了一些关于缓存的问题.有人知道这是否影响我提出的解决方案? 摘要: >多线程问题 任何意见或帮助这些方面将不胜感激! 解决方法
Heya Yarx – 第1-部分,在登录时缓存用户的所有权限.
然后,多线程访问不是问题,因为您的AuthorizeCore只是从缓存中获取角色,该缓存当时可以被视为只读. 第2部分: 肯定有一个更好的方法来处理这个不那么重的.如果您在单个请求中多次使用数据库,以获取权限,则需要通过某种机制来缓存您的权限集(自定义或实现另一个基于声明的系统等) 我不是100%跟随你的机制,而是基于路由的授权.你提到你正在从路线拉出信息 – 你能在这里举个例子吗? 保护孩子的行为绝对有意义.如果两个视图调用Html.Action – 一个专门作为一个管理员,另一个是错误地复制并粘贴到另一个视图中怎么办?你的孩子的行为应该总是受到保护,不要以为他们没有确定,因为他们只是从另一个角度来调用. 另外如果您无法为用户缓存整个树,那么您可以在第一次调用AuthorizeCore时缓存安全检查.随后的电话会简单地检查ex.缓存的角色 – 如果那么它使用它们,否则查看数据库. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 如何清除代码背后的整个asp.net页面?
- 我可以使用MiniProfiler来检测ASP.NET MVC WebApi网站吗?
- 如何使用ASP.NET创建XML文件并提示下载?
- asp.net-mvc-4 – 实体框架代码第一个多对多关系和继承
- asp.net-mvc – 对HTTP POST请求的正确响应是什么?
- asp.net-mvc – 在ASP MVC中,如何将新视图和文件返回给用户
- asp.net-mvc – 对Json解决方法的EntityFramework? (序列化
- asp.net – ServiceReference是一个自托管的WCF服务
- asp.net – 在开发系统上禁用OutputCache
- asp.net – 用于流量加密的公共反向代理背后的WCF