asp.net – 角色提供程序是否按请求缓存?
|
我的MVC应用程序在单个页面请求期间在多个位置使用用户角色.我的问题是默认的SqlRoleProvider是否在页面请求的生命周期中缓存当前用户的角色? 例如,我在Controller方法的属性中使用Roles: [Authorize(Roles = "Admin")] 和自定义代码 if (user.IsInRole(MembershipRole.Admin))
{
// Do something
}
else if (user.IsInRole(MembershipRole.Printer))
{
// Do something else
}
如果角色提供程序不缓存角色,是编写从默认角色继承的自定义角色提供程序的最佳解决方案,并覆盖方法以获取角色一次并在请求持续时间内缓存它们?这可以通过Authorize属性和我自己的代码都将使用缓存的角色来完成吗? (如果您想知道,我不想使用cacheRolesInCookie web.config选项来缓存cookie中的角色). 在此先感谢您的任何建议. [编辑以包含Joe的答案触发的详细信息] 我反编译了System.Web.Mvc.AuthorizeAttribute,AuthorizeCore方法为每个要检查的角色调用以下方法: httpContext.User.IsInRole 然后窥视System.Web.Security.RolePrincipal(上面是“User”),下面的方法确实使用了用户角色的缓存副本(或者如果为空则填充缓存): public string[] GetRoles() public bool IsInRole(string role) 缓存作为字段存储在User上,因此其生命周期是在请求期间. 方法使用以下方法查找角色: Roles.Providers[this._ProviderName].GetRolesForUser(this.Identity.Name) 因此将使用您为应用程序选择的任何角色提供程序(默认或自定义). 解决方法如果在ASP.NET或ASP.NET MVC应用程序中使用RoleProvider,则HttpContext.User将引用RolePrincipal,它会在请求的生命周期内缓存角色.但是,在使用ASP.NET角色的WCF服务中: <behavior ...>
<serviceAuthorization principalPermissionMode ="UseAspNetRoles"
roleProviderName ="MyRoleProvider" />
</behavior>
事实并非如此:相反,HttpContext.User将引用内部类System.ServiceModel.Security.RoleProviderPrincipal,它不会缓存角色:而是始终调用RoleProvider.IsUserInRole. 开箱即用的RoleProviders不进行任何缓存,因此可能导致重复连接到底层数据存储.对我来说这似乎是一个缺陷:在首次访问时缓存角色很容易.
对于ASP.NET或ASP.NET MVC不是必需的,但可以为WCF设想.请求持续时间的缓存可能会使用HttpContext.Items,因此会引入对HttpContext存在的依赖,但这不一定是一个问题,除了使单元测试更难.
如果在web.config中配置自定义RoleProvider,则无需执行任何操作,以便Authorize属性将使用它. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – 如何在MVC 3中基于XML文件动态创建控件
- asp.net-mvc – Asp.net MVC – 我可以从不同的视图文件夹加
- asp.net – 无法获取管道:loadVisitor(domain:)
- asp.net-mvc – 保护MVC中的文件夹
- asp.net-mvc – SignalR 2依赖注入与Ninject
- asp.net – 映射到用户的SignalR连接
- asp.net-mvc-3 – 在MVC 3实体框架中添加多个到多个链接表的
- asp.net-mvc-4 – Autofac和ASP .Net MVC 4 Web API
- asp.net-mvc – 以Razor语法为Telerik MVC Grid定义一个Tem
- 如何在ASP.NET核心rc2中禁用浏览器缓存?
- asp.net-web-api – 为什么我的ApiController方法
- .net – ASP MVC HTML Helpers – 好还是坏?
- 从ASP.NET Web API中删除XML中的命名空间
- asp.net – 为什么使用隐藏的字段?
- 在asp.net中使用Eval()是什么
- asp.net-mvc-3 – 模型验证/ ASP.NET MVC 3 – 条
- asp.net – 跨线程使用HTTPContext
- asp.net-mvc – Visual Studio提示使用Razor语法
- asp.net-mvc – MVC Razor String Concat
- 单元测试 – 使用MOQ对象进行ASP.NET MVC单元测试
