我做了一个验证的小试验 如下
我有两个页面 Default.aspx   Login.aspx
在Login.aspx中输入密码和用户名,代码如下
    protected void Button1_Click(object sender, EventArgs e)
    {
        string name = this.txt_name.Text;
        string password = this.txt_Password.Text;
        if (Confirm(name, password))
        {
            string roles = UserInRole(name);
            FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, name, DateTime.Now, DateTime.Now.AddMinutes(30), false, roles, "/");
            string ticketInProtect = FormsAuthentication.Encrypt(ticket);
            HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, ticketInProtect);
            Context.Response.Cookies.Add(cookie);
            Context.Response.Redirect(Context.Request["ReturnUrl"]);
        }
在Web中配置如下
    <authentication mode="Forms">
      <forms name=".ASPXCOOKIEDEMO" protection="All" loginUrl="login.aspx" timeout="30" path="/">
      </forms>
    </authentication>
    <authorization>
      <allow roles="Admin"/>
      <deny users="*"/>
    </authorization>
</system.web>    }
    private bool Confirm(string name, string password)
    {
        if (name == "lin" && password == "123")
            return true;
        else
            return false;
    }
    private string UserInRole(string name)
    {
        string Roles = "User";
        if (name == "lin")
        {
            Roles = "Admin";
            return Roles;
        }
        else
            return Roles;
    }之后我在global.asax文件中加入如下代码:
    void Application_AuthorizeRequest(object sender, System.EventArgs e)
    {
        HttpApplication App = (HttpApplication)sender;
        HttpContext Ctx = App.Context; //获取本次Http请求相关的HttpContext对象
        if (Ctx.Request.IsAuthenticated == true) //验证过的用户才进行role的处理
        {
            FormsIdentity Id = (FormsIdentity)Ctx.User.Identity;
            FormsAuthenticationTicket Ticket = Id.Ticket; //取得身份验证票
            string[] Roles = Ticket.UserData.Split(','); //将身份验证票中的role数据转成字符串数组
            Ctx.User = new System.Security.Principal.GenericPrincipal(Id, Roles); //将原有的Identity加上角色信息新建一个GenericPrincipal表示当前用户,这样当前用户就拥有了role信息
        }
    }
问题就是,为什么我登录不了Login.aspx页面,我觉得应该是角色那里没有匹配上,我设置断点确保了ReturnUrl是Default.aspx,并且UserData已经是Admin了
请大侠们帮我解决下,谢谢,分不够再加

解决方案 »

  1.   

    <?xml version="1.0"?>
    <configuration>
    <appSettings/>
    <connectionStrings/>
    <system.web>
    <compilation debug="true"/>
    <authentication mode="Forms"/> <roleManager enabled="true"/>
        <authentication mode="Forms"> 
          <forms name=".ASPXCOOKIEDEMO" protection="All" loginUrl="login.aspx" timeout="30" path="/"> 
          </forms> 
        </authentication> 
        <authorization> 
          <allow roles="Admin"/> 
          <deny users="*"/> 
        </authorization> 
    </system.web> 
    </configuration>
      

  2.   

    高歌的正确,是加上:<roleManager enabled="true"/> 但不建议你在web.config里配置角色,角色最好是在数据库里设置用户的角色
      

  3.   

    还是不行,我的Role不是从数据库取出来的,还有为什么要连接数据库的啊?
      

  4.   

    谢谢,我自己写了个RoleProvider类提供角色,已经可以了,但还是我还明白,验证用户的时候不需要这些,
    为什么当验证角色的时候就需要连接数据库,连接数据库后他取那个表,哪个字段呢?请解释下,谢谢
      

  5.   

    请问,不在不再Web里配置用户角色是什么意思?就是在把红色那段去掉吗,那么在数据库里面怎么设置?请解释下,谢谢
    <?xml version="1.0"?>
    <roleManager enabled="true"/> 
        <authentication mode="Forms"> 
          <forms name=".ASPXCOOKIEDEMO" protection="All" loginUrl="login.aspx" timeout="30" path="/"> 
          </forms> 
        </authentication> 
        <authorization> 
          <allow roles="Admin"/> 
          <deny users="*"/>
     
        </authorization> 
    </system.web> 
    </configuration>