2010-10-15 9 views
10

Mam problemy z zezwoleniem na dostęp do konkretnej roli do konkretnej strony w podkatalogu.ASP.NET Forms Auth Umożliwianie dostępu do określonego pliku w podkatalogu, gdy odmówi się wszystkim innym.

Moja aplikacja ASP.NET ma katalog, ~/Forms/Administration, który ma ograniczony dostęp. Istnieje określony plik ~/Forms/Administration/Default.aspx, który chcę nadać 1 dodatkowy dostęp do roli użytkownika, a także rolę administratora.

W ~/Formularze/Administration, mam pliku web.config, który wygląda tak:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <system.web> 
     <authorization> 
      <allow roles="Administrator, User" /> 
      <deny users="*"/> 
     </authorization> 
    </system.web> 

    <location path="Forms/Administration/Default.aspx"> 
     <system.web> 
      <authorization> 
       <allow roles="Administrator, User, AdditionalUser" /> 
      </authorization> 
     </system.web> 
    </location> 

</configuration> 

Użytkownik Admin działa dobrze, ale nie zawsze AdditionalUser. Próbowałem wielu rzeczy - wykaz lokalizacji jako

<location path="Forms/Administration/Default.aspx"> 

I jak

<location path="~/Forms/Administration/Default.aspx"> 

Czy zaprzeczyć = „*” od pierwszego generycznego reguły biorąc precedens? Próbowałem zmieniając

<deny users="*"/> 

Aby

<deny users="?"/> 

Ale to kończy się dając dostęp AdditionalUser do wszystko. Propozycje?

EDYCJA: Próbowałem umieścić konkretną lokalizację zezwalając na przed ogólnej reguły odmowy, w przypadku, gdyby porządek znaczenia. Taki sam problem.

AKTUALIZACJA: Brakuje mi czegoś tutaj: usunąłem deny * config i pozostawiłem tylko sekcję dotyczącą lokalizacji. Następnie, zamiast zezwalać na pewne role, ustawiam opcję odrzucania wszystkich (*). Jednak w ogóle nie zaprzeczam, kiedy się loguję. Zredukowalem nawet regue, by nie bylo specyficzne dla pliku, ale dotyczy calego katalogu i nie zaprzecza mi nic. Jednak oryginalne reguły nie dotyczące lokalizacji działają, więc wiem, że ten plik konfiguracyjny jest czytany.

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <location path="Forms/Administration"> 
     <system.web> 
      <authorization> 
       <deny users="*" /> 
      </authorization> 
     </system.web> 
    </location> 
</configuration> 

Odpowiedz

18

dwie rzeczy:

  1. Lokalizacja jest względna do pliku web.config, więc jeśli jest już w web.config/postacie/Administracji powinno być skorygowane, aby:

    <location path="Default.aspx"> 
        <system.web> 
         <authorization> 
          <allow roles="Administrator, User, AdditionalUser" /> 
         </authorization> 
        </system.web> 
    </location> 
    
  2. Aby wyjaśnić kolejność Zezwalaj i Odmów, autoryzacja będzie stosowana na podstawie pierwszego znalezionego dopasowania, więc zamówienie jest bardzo ważne. Na przykład: będą odrzucane

    <deny users="*" /> 
    <allow users="Administrator" /> 
    

Administrator ponieważ dopasowane pierwszego wpisu zaprzeczyć ... nawet jeśli określone, aby umożliwić użytkownikowi Administrator następnej linii.Tak, aby umożliwić tylko administrator, poprawna składnia byłoby:

<allow users="Administrator" /> 
<deny users="*" /> 

Podsumowując

Jeśli czytam, co chcesz prawidłowo, to prawdopodobnie produkt końcowy chcesz:

<configuration> 
    <system.web> 
    <authorization> 
     <allow roles="Administrator, User" /> 
     <deny users="*"/> 
    </authorization> 
    </system.web> 

    <location path="Default.aspx"> 
    <system.web> 
     <authorization> 
      <allow roles="AdditionalUser" /> 
     </authorization> 
    </system.web> 
    </location> 

</configuration> 
+0

Gah, to ma sens. Wypróbuję to rozwiązanie tak szybko, jak tylko będę mógł. – Matt

+0

Chris, możesz mi pomóc z http://stackoverflow.com/questions/15882511/how-do-i-conconfigure-asp-net-forms-authentication-to-deny-only-a-specific-url. Ponieważ potrzebuję tylko jednego użycia, aby uzyskać dostęp, właśnie wprowadzam jego dane do logowania –

+0

Lol @NatePet, skomentowałem twoje pytanie. Mam nadzieję, że pomaga –