0

私はこれを理解することはできません。

  • 私は次のサイトマップを持っています

    <?xml version="1.0" encoding="utf-8" ?>
    
    <siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
        <siteMapNode url="~/" title="Root"  description="Go root">
          <siteMapNode url="~/h" title="Home"  description="Go home" />
    
          <siteMapNode url="~/h/uo" title="Ultima Online" description="Ultima Online">        
            <siteMapNode url="~/h/uo/get" roles="RegisteredUser" title="Get account!" description="Get account!" />
          </siteMapNode>
        </siteMapNode>
    </siteMap>
    
    • このサイトマップファイルを指すXmlSiteMapProviderwithがあります。securityTrimmingEnabled="true"

    • トリミングしたいファイルauthorizationのフォルダにルールがありますweb.config

      <configuration>
        <system.web>
          <authorization>
            <deny users="?" />
          </authorization>
        </system.web>
      </configuration>
      
    • URLを使用してファイルにアクセスできません。入力http://localhost/h/uo/getすると、ログインページにリダイレクトされます。

    • <asp:Menu>マスターページファイルに次のように設定しました。

      <asp:SiteMapDataSource ID="MenuSiteMap" ShowStartingNode="false"
                             SiteMapProvider="MenuSiteMapProvider" runat="server" 
      />
      
      <div>
          <asp:Menu ID="NavigationMenu" runat="server" DataSourceID="MenuSiteMap" 
                    CssClass="menu" EnableViewState="false" 
                    IncludeStyleBlock="false" Orientation="Horizontal"
          />
      </div>
      

それでも、ページがレンダリングされるとGet account、何があっても、ログインしていないときにトリミングされるはずのノードが表示されます。

  • 私は何が間違っているのですか?
  • セキュリティトリミングが有効なサイトマップナビゲーションメニューを作成する他の方法はありますか?

ASP.NET 4.0を使用しており、HttpModuleを使用してURLを書き換えています。

4

1 に答える 1

1

http://forums.asp.net/t/975077.aspx/1を読んで、これがまさに私に起こっていることであることがわかりました。

ノードにURLがない場合は正常に動作しますが、URLがある場合は、すべてのノードと同じように動作します。セキュリティトリミングは無視されます。

私は、より直感的な役割ベースのサイトマップの実装に頼ることで、問題を解決しました。

public class TrimmingXmlSiteMapProvider : XmlSiteMapProvider
{
    public override bool IsAccessibleToUser(HttpContext context, SiteMapNode node)
    {
        if (node.Roles.Cast<string>().Any(r => r == "*"))
            return true;

        if (node.Roles.Count > 0 && node.Roles.Cast<string>().Count(Roles.IsUserInRole) == 0)
            return false;

        return node.ParentNode != null && node.ParentNode.IsAccessibleToUser(context);
    }
}

次に、私がしなければならなかった唯一の変更は、ルートレベルのロール定義にアスタリスクを追加することでした。

これはどのように作動しますか?

最初に、このノードに定義されている役割のいずれかがアスタリスクであるかどうかを確認します。その場合は、ノードを確認できます。

次に、ノードが全員レベルではない場合、指定された役割があるかどうか、およびログインしたユーザーが少なくとも1つの役割の一部であるかどうかを確認します。

最後に、親ノードがあるかどうかを確認し、それらのルールを継承します。

これにより、セキュリティトリミングは実際には「セキュリティトリミング」になり、うまく機能しなくなりますが、デフォルトでは機能しているはずです。

于 2011-08-27T17:36:11.270 に答える