主题:关于membership的问题
最近一段时间,被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机制,而限制了原始验证?也可能是我写的不对,大家有做过类似的项目的请给个建议吧!
于是我想完全抛开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机制,而限制了原始验证?也可能是我写的不对,大家有做过类似的项目的请给个建议吧!