1

C# ASP.NET 4 VS2010 を使用しています。

私は、通常どおり既に定義されている役割を持つメンバーシップを使用しています。

これを~/web.sitemap含むファイルがあります:

(~/セキュリティはすべて許可です。)

<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >

  <siteMapNode url="" title=""  description="">

    <siteMapNode url="" title="A menu for the Administrator"  description="">
      <siteMapNode url="~/Admin/ResetPassword.aspx" title="Reset password for a user"  description="" />
      <siteMapNode url="~/Admin/SendEmailToUser.aspx" title="Send e-mail to a user"  description="" />
    </siteMapNode>

    <siteMapNode url="" title="A menu for the SIC (second in command) person"  description="">
      <siteMapNode url="~/SIC/UnlockUser.aspx" title="Unlock a user"  description="" />
      <siteMapNode url="~/SIC/ApproveUser.aspx" title="Approve a user"  description="" />
    </siteMapNode>

    <siteMapNode url="" title="A menu for users"  description="">
      <siteMapNode url="~/Users/MakeYourContribute.aspx" title="Make your contribution"  description="" />
      <siteMapNode url="~/Users/CheckOnYourBalance.aspx" title="Check on your balance"  description="" />
    </siteMapNode>

    <siteMapNode url="" title="A menu for anonymous visitors"  description="">
      <siteMapNode url="~/AboutUs.aspx" title="About us"  description="" />
      <siteMapNode url="~/Application.aspx" title="Send an application to join us"  description="" />
    </siteMapNode>

  </siteMapNode>

</siteMap>

そして、次のように終わる web.config ファイル:

    <siteMap defaultProvider="XmlSiteMapProvider" enabled ="true">
      <providers>
        <add name="XmlSiteMapProvider" type="System.Web.XmlSiteMapProvider" siteMapFile="~/web.sitemap" securityTrimmingEnabled="true" />
      </providers>
    </siteMap>
  </system.web>
</configuration>

私のメニューはコントロールに基づいておりasp:Repeater、次のようになります。

<div>
    <ul>
        <li>
            <asp:hyperlink runat="server" id="lnkHome" navigateurl="~/Default.aspx">Home</asp:hyperlink>
        </li>
        <asp:repeater runat="server" id="menu" datasourceid="SiteMapDataSource1">
                        <ItemTemplate>
                            <li>
                                <asp:HyperLink ID="lnkMenuItem" runat="server" NavigateUrl='<%# Eval("Url") %>'><%# Eval("Title") %></asp:HyperLink>

                                <asp:Repeater ID="submenu" runat="server" DataSource="<%# ((SiteMapNode) Container.DataItem).ChildNodes %>">
                                    <HeaderTemplate>
                                        <ul>
                                    </HeaderTemplate>
                                    <ItemTemplate>
                                        <li>
                                            <asp:HyperLink ID="lnkMenuItem" runat="server" NavigateUrl='<%# Eval("Url") %>'><%# Eval("Title") %></asp:HyperLink>
                                        </li>
                                    </ItemTemplate>
                                    <FooterTemplate>
    </ul>
    </FooterTemplate> </asp:Repeater> </li> </ItemTemplate> </asp:Repeater> </ul>
    <asp:sitemapdatasource id="SiteMapDataSource1" runat="server" showstartingnode="true" />
</div>

フォルダに対する許可/拒否のセキュリティは、それぞれのフォルダに対して定義されます。セキュリティには 4 つのレベルがあります。1) 管理者。2) セカンド イン コマンド (SIC)。3) ユーザー (すべての登録ユーザー)。4) 匿名ユーザー。

たとえば、管理者ロールと SIC ロールのメンバーの両方がフォルダー内での操作を許可されています~/SICが、残りのユーザーはフォルダーから制限されています。

securityTrimmingEnabled="true"を に追加するとすぐweb.configに、メニューに表示されるのは だけですHome

何か間違った設定をしましたか?

このセキュリティに依存するメニューを機能させるために、他に必要な構成はありますか?

4

1 に答える 1

0

問題は、メニュー ヘッダーの空の URL です。

 <siteMapNode url="" title="A menu for the Administrator"  description="">

サイトマップ機能が空の URL "" のアクセス許可を決定しようとして失敗したようです。

回避策は、.sitemap ファイルを変更して、親ノードにアクセスできるロールを明示的に記述することです。

<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >

  <siteMapNode url="" title=""  description="" roles="*">

    <siteMapNode url="" title="A menu for the Administrator"  description="" roles="Administrators">
      <siteMapNode url="~/Admin/ResetPassword.aspx" title="Reset password for a user"  description="" />
      <siteMapNode url="~/Admin/SendEmailToUser.aspx" title="Send e-mail to a user"  description="" />
    </siteMapNode>

    <siteMapNode url="" title="A menu for the SIC (second in command) person"  description="" roles="administrators,second in command">
      <siteMapNode url="~/SIC/UnlockUser.aspx" title="Unlock a user"  description="" />
      <siteMapNode url="~/SIC/ApproveUser.aspx" title="Approve a user"  description="" />
    </siteMapNode>

    <siteMapNode url="" title="A menu for users"  description="" roles="administrators,secondincommand,users">
      <siteMapNode url="~/Users/MakeYourContribute.aspx" title="Make your contribution"  description="" />
      <siteMapNode url="~/Users/CheckOnYourBalance.aspx" title="Check on your balance"  description="" />
    </siteMapNode>

    <siteMapNode url="" title="A menu for anonymous visitors"  description="" roles="*">
      <siteMapNode url="~/AboutUs.aspx" title="About us"  description="" />
      <siteMapNode url="~/Application.aspx" title="Send an application to join us"  description="" />
    </siteMapNode>

  </siteMapNode>

</siteMap>

確かに、これは理想的ではありません。2 つの場所で部分的にセキュリティを構成しているためです。

もう 1 つのオプションはroles="*"、すべてのメニュー ヘッダーを配置することです。すべてのリーフ ノードにパーミッション チェックが適用され、必要に応じて非表示になります。これの欠点は、空のメニュー ヘッダーを表示できることです。

このソリューションを教えてくれたリソースは次のとおりです。 http://www.4guysfromrolla.com/articles/122805-1.aspx

于 2012-10-09T05:38:30.550 に答える