我的MVC应用程序在单个页面请求期间多次使用用户的角色。我的问题是默认的SqlRoleProvider是否会缓存当前用户在页面请求的生命周期内的角色?
例如,我在控制器方法的属性中使用角色:
[Authorize(Roles = "Admin")]
和自定义代码
if (user.IsInRole(MembershipRole.Admin))
{
// Do something
}
else if (user.IsInRole(MembershipRole.Printer))
{
// Do something else
}
如果Role Provider不缓存角色,最好的解决方案是编写一个自定义的Role Provider,继承默认的Role Provider,并重写方法以获取角色并将其缓存到请求持续时间。这样做能否使Authorize属性和您自己的代码都使用缓存的角色?(注:我不想使用cacheRolesInCookie web.config选项将角色缓存在cookie中。)
感谢您提供任何建议。
(如有疑问,我不想使用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)
缓存是作为用户字段存储的,因此它的生命周期与请求持续时间一样长。
这些方法使用以下方式查找角色:
Roles.Providers[this._ProviderName].GetRolesForUser(this.Identity.Name)
所以将使用您选择的应用程序角色提供程序(默认或自定义)。