运行时,授权模块从最本地的配置文件开始,循环访问 allow 和 deny 元素,直到它找到适合特定用户帐户的第一个访问规则。然后,该授权模块根据找到的第一个访问规则是 allow 还是 deny 规则来允许或拒绝对 URL 资源的访问。你设置<allow users="SiteAdmin"/>这个可行,但<allow roles="Administrator"/>这个不行。
说明你的程序没有问题,问题在于SiteAdmin这个用户的角色不是Administrator。string[] roles = id.Ticket.UserData.Split(',');
你是这个分隔角色的,但系统不会知道你的UserData中就是角色列表。除非你使用asp.net2.0默认的用户角色管理。我不太清楚你在httpmodule中是怎么还处理的。
要确保IPrincipal.IsInRole是有效的。
说明你的程序没有问题,问题在于SiteAdmin这个用户的角色不是Administrator。string[] roles = id.Ticket.UserData.Split(',');
你是这个分隔角色的,但系统不会知道你的UserData中就是角色列表。除非你使用asp.net2.0默认的用户角色管理。我不太清楚你在httpmodule中是怎么还处理的。
要确保IPrincipal.IsInRole是有效的。
{
// 提取窗体身份验证 cookie
string cookieName = FormsAuthentication.FormsCookieName;
HttpCookie authCookie = Context.Request.Cookies[cookieName];
if(null == authCookie)
{
// 没有身份验证 cookie。
return;
}
FormsAuthenticationTicket authTicket = null;
try
{
authTicket = FormsAuthentication.Decrypt(authCookie.Value);
}
catch(Exception ex)
{
// 记录异常情况详细信息(为简便起见,已省略)
return;
}
if (null == authTicket)
{
// 无法解密 Cookie。
return;
}
// 创建票证后,为 UserData 属性指定一个
// 角色名的以管道符分隔的字符串。
string[] roles = authTicket.UserData.Split(new char[]{'|'});
// 创建一个标识对象
FormsIdentity id = new FormsIdentity( authTicket );
// 该主体将通过整个请求。
GenericPrincipal principal = new GenericPrincipal(id, roles);
// 将新的主体对象附加到当前的 HttpContext 对象
Context.User = principal;
}
http://www.cnblogs.com/yoyozhou/archive/2006/11/29/576439.html