我认为将安全性与 MasterPage 混合不是一个好主意 - .NET 具有出色的安全性框架,那么为什么不利用它呢?
假设以下架构:
- 登录用户可以看到 Default.aspx
- 管理员可以看到 /Admin 文件夹下的任何内容
- 已登录的用户看不到 /Admin 文件夹
- 匿名用户只能看到任何内容
Web.config:
<location path="Admin">
<system.web>
<authorization>
<allow roles="Admin"/>
<deny users="*"/>
</authorization>
</system.web>
</location>
<location path="Default.aspx">
<system.web>
<authorization>
<deny users="?"/>
<allow users="*"/>
</authorization>
</system.web>
</location>
<system.web>
<authentication mode="Forms">
<forms loginUrl="Login.aspx" defaultUrl="Default.aspx" cookieless="UseCookies" />
</authentication>
<anonymousIdentification enabled="true"/>
<roleManager enabled="true" defaultProvider="MyRoleProvider">
<providers>
<add name="MyRoleProvider" type="MyNamespace.MyRoleProvider, WebApplication1"/>
</providers>
</roleManager>
<membership defaultProvider="MyMembershipProvider">
<providers>
<add name="MyMembershipProvider" type="MyNamespace.MyMembershipProvider, WebApplication1"/>
</providers>
</membership>
</system.web>
MyMembershipProvider & MyRoleProvider 类:
namespace MyNamespace {
public class MyMembershipProvider : System.Web.Security.MembershipProvider {
// override at least ApplicationName, CreateUser and ValidateUser
// you can throw NotImplementedException for rest
}
public class MyRoleProvider : System.Web.Security.RoleProvider {
// override at least GetAllRoles(), GetRolesForUser() and RoleExists
// you can throw NotImplementedException for rest
}
}
登录.aspx:
// after validation that username&password is correct call
FormsAuthentication.RedirectFromLoginPage(txtUserName.Text, chxRememberMe.Checked);
恭喜 - 现在您已经连接到标准的 .NET Web 安全提供程序模型。现在您可以像这样享受它:
<asp:LoginView ID="MasterLoginView" runat="server">
<AnonymousTemplate>
Welcome: Guest
</AnonymousTemplate>
<LoggedInTemplate>
Welcome:
<asp:LoginName ID="MasterLoginName" runat="server" />
</LoggedInTemplate>
</asp:LoginView>
或
<asp:LoginView ID="MasterLoginView" runat="server">
<RoleGroups>
<asp:RoleGroup Roles="Admin">
<ContentTemplate>
Welcome mighty admin
</ContentTemplate>
</asp:RoleGroup>
</RoleGroups>
</asp:LoginView>
此外,如果您为站点链接使用 Sitemap 提供程序,当您启用安全修整时,.NET 将使用此提供程序来计算哪些链接可以显示给用户等。