ASP.NET web.sitemap - role nezdá se, že ovládat viditelnost?

hlasů
11

Mám (jednoduché) Sitemap a snažím se přijít na to, proč určitý sub-menu je vždy viditelné.

<?xml version=1.0 encoding=utf-8 ?>
<siteMap xmlns=http://schemas.microsoft.com/AspNet/SiteMap-File-1.0 >
  <siteMapNode url=~/Login.aspx title=Home description=RivWorks roles=*>
    <siteMapNode url= title=Dashboard description= roles=campaigns, auto_negotiation>
      <siteMapNode url=CampaignBuilder.aspx title=Campaign Manager description=Manage your campaign settings roles=campaigns />
      <siteMapNode url=ProductManager.aspx title=Negotiation Manager description=Manage your product and negotiation settings roles=auto_negotiation />
    </siteMapNode>
    <siteMapNode url= title=Support Options description= roles=customers, customer_super, riv_admins, riv_super>
      <siteMapNode url=ChangePassword.aspx title=Change Password description= roles=customers, customer_super, riv_admins, riv_super />
      <siteMapNode url=http://rivworks.zendesk.com/requests/anonymous/new title=Submit a Support Ticket description= roles=customers, customer_super, riv_admins, riv_super />
      <siteMapNode url=http://rivworks.zendesk.com/forums/49919/entries title=Tips &amp; Tricks description= roles=customers, customer_super, riv_admins, riv_super />
    </siteMapNode>
  </siteMapNode>
</siteMap>


Poznámka: Nastavení web.config

<siteMap defaultProvider=XmlSiteMapProvider enabled=true>
  <providers>
    <add name=XmlSiteMapProvider
         description=Default Site Map Provider
         type=System.Web.XmlSiteMapProvider
         siteMapFile=Web.sitemap
         securityTrimmingEnabled=true />
  </providers>
</siteMap>


Mám hlavní volbu menu „Dashboard“. Pod touto položkou menu Mám 2 možnosti: 1) Campaign Manager a 2) Vyjednávání Manager. A teď, co je zajímavé je, když jsem v jedné roli kampaní OR auto-vyjednávání roli vidím Dashboard a OBĚ položky sub-menu. To není chování jsem očekával. I očekávat, že pouze obě dílčí menu, když jsem v kampaních role a auto-vyjednávání roli. OR scénář by mi položku a jediném panelu nabídek NEBO druhý dílčí položky ...

Dělám něco špatně, nebo přemýšlel špatně?

TIA

Položena 22/03/2010 v 21:46
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
26

Mám podezření, že jste padli do pasti my všichni, v přesvědčení, že role přisuzují omezuje viditelnost uzlů. Není to ve skutečnosti rozšiřuje viditelnost. Veškerá omezení se provádí pomocí standardní část v web.config.

Plný text dole je od původního příspěvku na https://web.archive.org/web/20130408064047/http://ipona.com/asp-net-site-maps-security-trimming-and-roles/ )

To je jedna z nejčastějších otázek, a zdá se, stálý zdroj zmatku pro každého, jak to bylo pro mě, když jsem poprvé četl o tom. Platformě ASP.NET SiteMap umožňuje navigační struktura je definována jako soubor XML prvky, které jsou ideální pro popis hierarchii položek menu. Tyto položky XML jsou siteMapNode element, který má role atributů. Je zřejmé, že tento definuje role, které můžete vidět tuto položku, ale jasné je ve skutečnosti nesprávné. Zde je nejdůležitější fakt o mapách stránek:

Role atribut neomezuje viditelnost uzlu.

To by mělo být dostatečně jasná, i když se stále zdá být v pořádku. Zde je návod, jak to funguje. All omezení stránek je řešen přes povolení. To lze provést buď v základním web.config, nebo v web.config soubory ve složkách. Předpokládejme například, že existuje složka správce, pod kterým jsou všechny stránky byly administrativní zachována. jen chcete přístupné tyto stránky pro uživatele v roli správce. Byste nastavit oprávnění jako tak:

<location path="Admin">
  <system.web>
    <authorization>
      <allow roles="Admin" />
      <deny users="*" />
    </authorization>
  </system.web>
</location>

Složka Správce nyní může již být přístupné každému, kdo není v roli správce; pokud nejste v roli správce a snaží se přejít na stránku ve složce správce, a to buď prostřednictvím odkazu na jinou stránku, nebo zadáním adresy URL přímo do prohlížeče, budete přesměrováni na přihlašovací stránku. Můžete mít více lokalizační prvky v web.config pro různé složky, nebo dokonce jednotlivé soubory; Ve skutečnosti, pokud máte restriktivní stránky, možná budete chtít, aby explicitně otevřít některé stránky, například na přihlašovací stránku; Je těžké se přihlásit na místě, když nemáte oprávnění pro přístup k přihlašovací stránku. Pokud nechcete, aby nepořádek své základny web.config můžete vytvořit soubor web.config ve složce Správce se stejnými pravidly; nebudete potřebovat umístění prvku, protože konfigurace se vztahuje na aktuální složky.

Tak to je povolení provést; Přístup na stránky je uzamčena. Nyní umožňuje vzít v úvahu navigaci. Navigační ASP.NET rámec ctí povolení, ale pouze tehdy, pokud jste nastavili zabezpečení ořezávání na poskytovateli, který není ve výchozím nastavení nakonfigurována. To znamená, že budete muset přidat nastavení mapa stránek na web.config:

<siteMap enabled="true" defaultProvider="AspXmlSiteMapProvider">
  <providers>
    <clear />
    <add name="AspXmlSiteMapProvider" securityTrimmingEnabled="true"
     type="System.Web.XmlSiteMapProvider, System.Web, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
     siteMapFile="web.sitemap"/>
  </providers>
</siteMap>

Většina z nich je nastaven na úrovni stroje při instalaci ASP.NET, ale zásadně se hodnota securityTrimmingEnabled je nastavena na hodnotu false. Co to dělá, je výše vyklidit existující konfiguraci a přidat novou položku s atributem nastaveným na hodnotu true. V této fázi navigační rámec bude nyní ctít pravidla o povolení, aby položky menu se nezobrazí v případě, že uživatel nemá oprávnění pro danou položku; nezáleží na tom, jestli používáte Menu nebo TreeView k zobrazení položek menu, rozhodující část je pomocí SiteMapDataSource (nebo Mapa webu API, pokud jste ručně budování menu). Máte-li mapu vlastního webu provozovatele, jako je například databáze řízený jeden z (jako je tenhle na webu MSDN), pak to možná bude muset udělat svůj vlastní bezpečnostní kontroly, ale záleží na kterém základní třída zdědí od. To je jiný příběh pro jiné místo ačkoli.

Takže pokud nepotřebujete upravovat mapu stránek prvky sami, co je role atribut? Dobře to funguje v opačném směru budete pravděpodobně očekávat, otevíráním viditelnost uzlu, což ukazuje na uzel, pokud je uživatel v uvedeném roli i v případě, že nemají oprávnění k přístupu na stránky sám (protože autorizační pravidlo je omezit od přístupu k němu). Proč by jsi to udělal? No, budete muset pochopit, jak zabezpečení ořezávání práce. Při rozhodování o tom, zda uživatel může vidět uzel, jak autorizaci a jsou kontrolovány oprávnění fyzického souboru; pokud buď selžou, pak uzel je považován za nepřístupný. K dispozici jsou dvě velmi časté případy, kdy fyzická kontrola souborů selhat:

  1. Adresa URL není místní. V případě, že soubor neexistuje lokálně pak žádná kontrola se může uskutečnit.
  2. Není URL. Uzel může být jen kontejner uzlu, s dětskými stránkách, ale ne samotné stránce.

V obou těchto případech je fyzická kontrola souborů selhat, takže uzel se nezobrazí. Proto možná budete muset otevřít viditelnost uzlu. Například zvažte následující skutečnosti:

<siteMapNode title="Admin" roles="Admin">
    <siteMapNode url="~/Admin/membership_CreateMember.aspx" title="Create User" />
    <siteMapNode url="~/Admin/membership_GetUsers.aspx" title="View Users" />
    <siteMapNode url="~/Admin/roleManager_CreateRole.aspx" title="Create Role" />
    <siteMapNode url="~/Admin/roleManager_AddUserToRole.aspx" title="Add User to Role" />
</siteMapNode>

Zde uzel správce nemá fyzickou stránku, je to čistě umožnit organizaci admin předmětů do své vlastní podmenu. Bez dodatečné role přisuzují uzel a děti by se neobjevil, ale role =“správce“ uvádí, že uzel musí být také prokázáno, že uživatelé v roli správce, a to i v případě, že kontrola zabezpečení selže. Nepotřebujeme atribut na podřízené uzly, protože mají fyzické stránky, takže kontroly souborů uspěje.

Takže je to docela jednoduché, pokud si pamatuji pravidla:

  • Konfigurace omezení zabezpečení na stránkách s povolením v web.config.
  • Předefinovat poskytovatele mapa stránek, což umožňuje zabezpečení ořezávání.
  • Přidat role přisuzují mapových site uzlů rozšířit viditelnost.
Odpovězeno 22/03/2010 v 23:42
zdroj uživatelem

hlasů
1

Co chcete, je to, co ASP.NET označuje jako „ Site-Map zabezpečení ořezávání “. Již jste udělal většinu práce - tedy přiřazení rolí uzly v sitemap. Nyní vše, co zbývá udělat, je trochu konfiguraci.

Ve vašem web.configpřidejte nového provozovatele mapa stránek pomocí standardu XmlSiteMapProvider, ale securityTrimmingEnabled="true", a činí z tohoto výchozího poskytovatele:

<system.web>
  <siteMap defaultProvider="XmlSiteMapProvider" enabled="true">
    <providers>
      <add name="TrimmedSitemap"
        type="System.Web.XmlSiteMapProvider"
        siteMapFile="Web.sitemap"
        securityTrimmingEnabled="true" />
    </providers>
  </siteMap>
</system.web>
Odpovězeno 22/03/2010 v 21:51
zdroj uživatelem

hlasů
0

Vím, že to je super starý, ale jsem zdědil nějaký starý kód a narazil na stejný problém. Můj šéf chtěl, abych se dočasně skrýt viditelnost prvků z jedné role, ale přesto aby bylo přístupné jinde na webu. I očekával jen odebrat roli ze sitemap a nebude viditelný pro tuto roli. Eric jasně vysvětlil, jak je to určeno ke zlepšení viditelnosti spíše než limit.

Jen jsem chtěl dát příklad, jak se dělá to fungovat tak, jak (a já) byl očekával, že by fungovaly (role musí být přítomen v obou místech).

<asp:Menu ID="Menu1" runat="server" DataSourceID="SiteMapDataSource1" OnMenuItemDataBound="Menu1_TreeNodeDataBound" />

protected void Menu1_TreeNodeDataBound(object sender, MenuEventArgs e)
{
    if (e.Item.DataItem!=null && ((SiteMapNode)e.Item.DataItem).Roles.Count > 0 && HttpContext.Current.User.Identity.IsAuthenticated)
    {
        string role = Common.GetUserRole();  // I have a single role provider and a common function to get the role.  You could always loop through Roles and use HttpContext.Current.User.IsInRole()         
        if (role.Length > 0)
        {
            if (!((SiteMapNode)e.Item.DataItem).Roles.Contains(role))
            {
                if (e.Item.Parent != null)
                    e.Item.Parent.ChildItems.Remove(e.Item);
                else
                    Menu1.Items.Remove(e.Item);
            }
        }            
    }
}
Odpovězeno 01/08/2018 v 21:32
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more