我有 MVC4 应用程序,它使用 SimpleMEmbershipProvider 进行身份验证机制。
一切正常,除了当我返回应用程序并使用持久 cookie 进行身份验证时。
我已通过身份验证,但无法访问分配给我的角色。实际上,根本无法访问角色:
string.Join(",", Roles.GetRolesForUser(User.Identity.Name))
返回空字符串
可能是什么原因造成的?
我有 MVC4 应用程序,它使用 SimpleMEmbershipProvider 进行身份验证机制。
一切正常,除了当我返回应用程序并使用持久 cookie 进行身份验证时。
我已通过身份验证,但无法访问分配给我的角色。实际上,根本无法访问角色:
string.Join(",", Roles.GetRolesForUser(User.Identity.Name))
返回空字符串
可能是什么原因造成的?
当 SimpleMembershipProvider 尚未初始化时,可能会发生这种情况。示例 MVC 表单身份验证模板假定您将允许匿名访问您的站点,并且在您进入登录页面之前不会初始化成员资格提供程序。但是,一种更常见的安全技术是要求登录才能访问任何站点,并在 _layout 页面中定义由角色确定的菜单选项。但是,如果您使用持久性 cookie,则不会重新访问登录页面,因此不会从成员数据库中加载经过身份验证的用户的角色。
您要做的是在用户进入站点时初始化提供程序,以便加载值。为此,您需要在 App_Start 文件夹中 FilterConfig 类的 RegisterGlobalFilters 方法中添加以下过滤器
filters.Add(new YourAppNameSpace.Filters.InitializeSimpleMembershipAttribute());
当通过 cookie 验证的用户进入站点时,这将导致从数据库加载用户数据。
另一种替代技术是将 [InitializeSimpleMembership] 装饰器添加到通过 cookie 身份验证的用户可能直接输入的任何控制器方法中。如果你必须把它放在很多控制器上,这有点乱。因此,在大多数情况下,将其放在全局过滤器中会更好。