牛腩购物网的一个小bug清除:当后台 admin 角色,不注销 而去前台首页的时候,前台显示为登录但是 角色不对
但是实际上,前台是给 user 这个用户组用来注册和登陆的,那么在前台这里显示 后台的 admin 角色里面的用户名,显然是错的。这是为什么么?
因为,
LoginView 控件根据用户是否经过身份验证以及他(或她)属于哪个网站角色(如果用户经过身份验证),为不同的用户显示不同的网站内容模板(或者说“视图”)。
存储在 AnonymousTemplate属性中的模板向所有未在网站中登录的访问者显示。用户登录后,网站或者显示与 RoleGroups属性中该用户的某个角色相关联的模板,
或者显示 LoggedInTemplate属性中指定的默认模板。
1:匿名状态,是指用户还没有登陆的时候显示的状态,
<AnonymousTemplate> <table width="100%" height="134" border="0"> <tr> <td height="48"> </td> </tr> <tr> <td>用户:<asp:TextBox ID="txtName" runat="server"></asp:TextBox></td> </tr> <tr> <td>密码:<asp:TextBox ID="txtPwd" runat="server" TextMode="Password"></asp:TextBox> </td> </tr> <tr> <td align="center"> <asp:LinkButton ID="lbtnLogin" runat="server" OnClick="lbtnLogin_Click">登录</asp:LinkButton>
<a href="#"></a><a href="reg1.aspx">注册</a><a href="getpwd1.aspx" target="_blank">忘记密码 </a></td> </tr> </table> </AnonymousTemplate>
2:登陆后状态(这个时候,是指登陆后的状态,但是是不分角色的,也就是他不识别你是 user 还是 admin 角色,只是识别 你登陆了)
<LoggedInTemplate> <br> <br> <br> 欢迎您,<asp:LoginName ID="LoginName1" runat="server" />(<asp:Literal ID="litIsVip" runat="server"></asp:Literal>) <asp:LoginStatus ID="LoginStatus1" runat="server" /> </LoggedInTemplate>
我们刚才会错误的原因,也是因为用了这个LoggedInTemplate,所以导致只要是有登陆的,都会显示你的用户名,以及注销按钮。
3:那么,正确的做法是? 使用 RoleGroups属性中该用户的某个角色相关联的模板
<RoleGroups> <asp:RoleGroup Roles="user"><%-- 如果是用户角色,那么我们显示,欢迎您,用户名,是否是vip,以及注销按钮 --%> <ContentTemplate> 欢迎您,<asp:LoginName ID="LoginName1" runat="server" /> (<asp:Literal ID="litIsVip" runat="server"></asp:Literal>) <asp:LoginStatus ID="LoginStatus1" runat="server" /> </ContentTemplate> </asp:RoleGroup> <asp:RoleGroup Roles="admin"><%--如果是管理员角色,那么我们还是显示登陆的登陆框—%>
<ContentTemplate>
<table width="100%" height="134" border="0"> <tr><td height="48"> </td></tr><tr><td>用户:
<asp:TextBox ID="txtName" runat="server"></asp:TextBox></td></tr> <tr><td>密码:<asp:TextBox ID="txtPwd" runat="server" TextMode="Password"></asp:TextBox></td> </tr> <tr> <td align="center"> <asp:LinkButton ID="lbtnLogin" runat="server" OnClick="lbtnLogin_Click">
登录</asp:LinkButton><a href="#"></a><a href="reg1.aspx">注册</a><a href="getpwd1.aspx" target="_blank">忘记密码 </a></td> </tr> </table>
</ContentTemplate>
</asp:RoleGroup> </RoleGroups>
4:在后台,如何判断用户是否登陆? Page.User.Identity.IsAuthenticated 这个用户是什么角色? Page.User.IsInRole("user")
//在登陆的窗口这里,如果登陆后,显示是什么会员类型 if (Page.User.Identity.IsAuthenticated) { Model.User u = new DAL.UserDAO().GetModel(Page.User.Identity.Name); if (u != null) { if (Page.User.IsInRole("user")) //如果用户属于 user 这个角色,我们就显示他的 会员级别 { Literal litIsVip = LoginView1.FindControl("litIsVip") as Literal; litIsVip.Text = u.type == "normal" ? "普通会员" : "VIP会员"; } } }
总结:
LoginView 控件根据用户是否经过身份验证以及他(或她)属于哪个网站角色(如果用户经过身份验证),为不同的用户显示不同的网站内容模板(或者说“视图”)。
存储在 AnonymousTemplate属性中的模板向所有未在网站中登录的访问者显示。
用户登录后,网站或者显示与 RoleGroups属性中该用户的某个角色相关联的模板,或者显示 LoggedInTemplate属性中指定的默认模板。
为LoginView类的以下三个模板属性中的任何一个属性分配了模板后,LoginView 控件将管理不同模板之间的切换:
● AnonymousTemplate 指定向未登录到网站的用户显示的模板。登录用户永远看不到此模板。
● LoggedInTemplate 指定向登录到网站,但不属于任何具有已定义模板的角色组的用户显示的默认模板。
● RoleGroups 指定向已登录且是具有已定义角色组模板的角色的成员显示的模板。内容模板与 RoleGroup实例中的特定角色集相关联。