asp.Net C#site.Master - 排除Default.aspx页面?

时间:2014-08-21 13:55:19

标签: c# asp.net site.master

假设有两种类型的用户:普通用户(未在项目中指定的人员)和管理员(在安全角色中定义)。我有一个c#web app项目,它跟在site.Master之后,用于布局和安全角色(仅限管理员访问)。

但是,我想向管理员和普通用户开放 Default.aspx 页面。目前,如果您是普通用户并尝试访问Default.aspx,您将被重新路由到" AccessDenied.aspx"页面,如果他们被给予任何其他页面的链接,它应该如何。

  1. 有没有办法在同一个内部抑制该功能 default.aspx的site.Master页面?我想坚持1 母版页,仍然想参考原版" site.Master" 所以我不必复制布局等。

  2. 如果有,是否也可以让普通用户只看到 带有" Home"的Default.aspx页面菜单上的链接(同时 管理员会看到主页,管理员等其他标签下拉列表?

  3. 在后面的代码中,我通过检查访问页面的用户的安全角色来处理重新路由到Access Denied页面。有没有办法说"如果用户在Default.aspx页面上,请忽略此重新路由" ?

1 个答案:

答案 0 :(得分:2)

我认为将安全性与MasterPage混合并不是一个好主意 - .NET具有很好的安全框架,那么为什么不利用它呢? 假设以下架构:

  • 已登录的用户可以看到Default.aspx
  • 管理员可以在/ 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&amp; 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
  }
}

Login.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>

此外,如果您使用站点地图提供程序进行站点链接,则在启用安全修整时,.NET将使用此提供程序计算可向用户显示的链接等。