【发布时间】:2013-03-12 03:10:32
【问题描述】:
我有 ASP.NET MVC 4 应用程序。我使用 Simple Membership Provider 允许勾选登录表单下的记住我复选框。如果勾选,将创建持久性 cookie .ASPXAUTH,自登录日期起 100 天后过期。除了应用程序的主菜单外,一切正常。
菜单的某些部分仅供管理员用户使用。我用:
@if (User.IsInRole("Administrator")) { @Html.Partial("_MainMenuPartial") }
锁定它们,使其不被呈现给普通用户。这种方法在登录系统后就可以正常工作。当我在一段时间后返回并使用持久 cookie 对我进行身份验证时,我确实登录了,但是
@User.IsInRole("Administrator")
返回“False”,所以我看不到管理菜单项。同时
@User.Identity.Name
返回正确的登录名和
@User.Identity.IsAuthenticated
返回“True”,证明持久 cookie 工作正常。为什么即使用户经过系统验证,我也无法访问用户角色?
【问题讨论】:
-
您是如何实际创建角色的?什么时候真正为用户分配角色 - 在您的注册 ActionResult 中?
-
是的,这就是我在注册操作中的做法:Roles.AddUsersToRoles(new[] { model.UserName }, new[] { role });而角色是之前确定的字符串。
-
一种更安全的方法是在 InitialiseSimpleMembershipAttribute.cs 类中:在
Websecurity.InitialiseDatabaseConnection下方使用if (!Roles.RoleExists("Admin")) Roles.CreateRole("Admin");。您是否尝试使用我在回答中描述的重载方法。 -
我发现这个问题的解决方案是在 App_Start 文件夹的 FilterConfig 类的 RegisterGlobalFilters 方法中添加一个过滤器。有关详细信息,请参阅此:stackoverflow.com/questions/16215316/…
标签: asp.net-mvc forms-authentication simplemembership .aspxauth