【问题标题】:asp.Net C# site.Master - Exclude Default.aspx page?asp.Net C# site.Master - 排除 Default.aspx 页面?
【发布时间】:2015-05-10 23:21:00
【问题描述】:

假设有两种类型的用户:普通用户(项目中未指定的人)和管理员(在安全角色中定义)。我有一个遵循站点的 c# Web 应用程序项目。Master 用于布局和安全角色(仅限管理员访问)。

但是,我想让 Default.aspx 页面对管理员和普通用户都开放。目前,如果您是普通用户并尝试访问 Default.aspx,您将被重新路由到“AccessDenied.aspx”页面,如果为他们提供了指向任何其他页面的链接,则应该是这样。

  1. 有没有办法在同一 仅 Default.aspx 的 site.Master 页面?我想坚持1 母版页,还想引用原来的“site.Master” 这样我就不必复制布局等了。

  2. 如果有,是否也可以让普通用户只看到 菜单上带有“主页”链接的 Default.aspx 页面(而 Admin 会看到 Home、Admin 等其他选项卡的下拉菜单)?

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

【问题讨论】:

  • 是的,两者都是可能的,但它会导致我想象的难看的代码。
  • @Matthew - 哦。 :(我希望有一个快速/简单的单行来抑制默认页面上的安全部分。
  • 您可以通过查看Page 属性来确定(从母版页代码隐藏)它正在处理哪个页面,将其类型与默认页面类型Page.GetType() == typeof(_Default) 进行比较。但是,在我看来,这是丑陋的代码,对可维护性非常不利。
  • @Matthew - 我认为标记界面更干净;即让 Default.aspx 从 ISuppressSecurityCheck 继承,并且检查看起来像(页面是 ISuppressSecurityCheck)。
  • @OndrejSvejdar 抱歉-这里是新手。不知道你的意思。请您解释的更详细一点好吗?谢谢!

标签: c# asp.net master-pages


【解决方案1】:

我认为将安全性与 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 将使用此提供程序来计算哪些链接可以显示给用户等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    • 2011-11-16
    • 2022-01-23
    相关资源
    最近更新 更多