运行时,授权模块从最本地的配置文件开始,循环访问 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是有效的。

解决方案 »

  1.   

    protected void Application_AuthenticateRequest(Object sender, EventArgs e)
    {
    // 提取窗体身份验证 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