/*
//这里演示如何在Global.asax中自定义角色
void RoleManager_GetRoles(object sender, RoleManagerEventArgs e)
{
if (e.Context.Request.IsAuthenticated)
{
e.Context.User = new GenericPrincipal(new GenericIdentity(e.Context.User.Identity.Name), new string[] { "Admins" });
e.RolesPopulated = true;
}
}
*/
//如果e.RolesPopulated为真,代表开发人员自己创建了角色信息,
//RoleManagerModule就不会 生成RolePrincipal 对象了.
return;
}
}
......
if (!(context.User is RolePrincipal))
{
context.User = new RolePrincipal(context.User.Identity);
}
Thread.CurrentPrincipal = context.User;
注意:我们并没有像ASP.NET1.1中那样在AuthenticateRequest事件中生成User对象.但是User对象会在FormsAuthenticationModuleHTTP模块中使用Forms身份验证的特定Cookie重新被包装成一个GenericPrincipal对象(角色为空).
在说明RolePrincipal对象有什么用之前,需要了解这个对象是何时被用到的.
在UrlAuthorizationModule被初始化时中向HttpApplication对象注册的事件AuthorizeRequest被触发.在这个事件中会调用RolePrincipal对象(就是Context.User)的方法IsInRole, IsInRole方法会自动查找角色提供程序(本示例使用默认提供程序AspNetSqlProvider,数据库为前面自动生成的ASPNETDB.MDF),并验证用户角色,代码截图如下:而IsUserAllowed方法最终会调用RolePrincipal对角的IsInRole方法来判断当前用户是否拥有某角色,方法截图如下: