我正在关注this article,其中介绍了在使用表单身份验证登录时如何为用户分配角色:
public void Application_AuthenticateRequest( Object src , EventArgs e )
{
if (!(HttpContext.Current.User == null))
{
if (HttpContext.Current.User.Identity.AuthenticationType == "Forms" )
{
System.Web.Security.FormsIdentity id;
id = (System.Web.Security.FormsIdentity)HttpContext.Current.User.Identity;
String[] myRoles = new String[2];
myRoles[0] = "Manager";
myRoles[1] = "Admin";
HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(id,myRoles);
}
}
}
我将角色逻辑放在事件处理程序中,所以我基本上不需要角色提供程序。尽管如此,为了运行此功能,似乎我必须在web.config
中启用角色提供程序。可悲的是,如果我只是说:
<roleManager enabled="true"/>
它会导致与SQL服务器连接失败相关的运行时错误,就像我选择AspNetSqlRoleProvider
作为角色提供程序一样。
如何让角色以这种方式工作?我怎样才能选择不使用角色提供者,或者我应该如何实现虚拟角色提供者(如果有意义的话)?
答案 0 :(得分:2)
您不需要在web.config中启用roleManager
- 毕竟,人们过去常常在使用.NET 1.x时使用角色。
roleManager
将为您做的一件事,即您未在代码中执行的操作,将Thread.CurrentPrincipal
设置为HttpContext.Current.User
。如果你依赖于此(例如使用PrincipalPermissionAttribute
),那么你需要添加:
Thread.CurrentPrincipal = HttpContext.Current.User;
否则,我希望它能起作用:你看到什么症状让你认为它不起作用?
至于实现虚拟RoleProvider
,这很容易:例如,请参阅this MSDN article。
您只需要实施GetRolesForUser
和IsInRole
方法;其他方法可以简单地抛出NotSupportedException
。