最近一段时间,被MS的membership搞得焦头烂额的.突然明白了MS的整个membership的机制就是"鸡肋",食之无肉,弃之有味.如果我存储的用户信息和MS要求的在很大程度上不同,也就是说表中的字段很多是不一样的.比如我想存QQ,公司名,但不想存问题和答案,那么我就要重写membershipprovider,同时membershipuser的属性也变了,那还要重写membershipuser.算下来,全部是我写的,MS的东西我根本就没用到多少呀.
于是我想完全抛开MS的这一机制,自己写验证.可是又遇到问题了:
我是这样做的:
验证用户:(Users 是自定义的用户类,roles存放角色信息)
        Users curUser = UserUtil.GetUserByID(int.Parse(Login1.UserName));
        string roles = UserUtil.GetAllUserRoles(curUser.UserID);
        FormsAuthenticationTicket Ticket = new FormsAuthenticationTicket(1, Login1.UserName, DateTime.Now, DateTime.Now.AddMinutes(30), false, roles, "/");
        string HashTicket = FormsAuthentication.Encrypt(Ticket);
        HttpCookie UserCookie = new HttpCookie(FormsAuthentication.FormsCookieName, HashTicket);
        Response.Cookies.Add(UserCookie);
给用户添加角色信息:(在Global.asax文件中)

    protected void Application_AuthorizeRequest(object sender, EventArgs e)
    {
        HttpContext Ctx = HttpContext.Current;
        if (Ctx.Request.IsAuthenticated == true)
        {
            FormsIdentity Id = (FormsIdentity)Ctx.User.Identity;
            FormsAuthenticationTicket Ticket = Id.Ticket;
            string[] Roles = Ticket.UserData.Split(',');
            Ctx.User = new GenericPrincipal(Id, Roles);
        }
    }
获取用户角色信息:
    为了验证我的做法是不是正确,我用了如下方法:
     RolePrincipal r = (RolePrincipal)User;
     string[] role=rolesArray = r.GetRoles();
可当执行第一句时,居然运行不过去,说是User为GenericPrincipal类型的变量,无法转化为RolePrincipal.这段代码可是MS提供的(MSDN上有).搞什么呀,这不是MS自己打自己的嘴吗?
     于是我决定换个方法验证,在web.config中对某个页面进行如下设置:
  <location path="UserList.aspx">
    <system.web>
      <authorization>
        <deny users="*"/>
        <allow roles="Admin"/>
      </authorization>
    </system.web>
  </location>
靠,居然无法进入此页面.看了一下用户,确实在"Admin"这一组里.怎么会这样,在1.1中这种方法还行得通.到了2.0中居然不能用了.会不会是MS为了推广membership机制,而限制了原始验证?也可能是我写的不对,大家有做过类似的项目的请给个建议吧!