Подтвердить что ты не робот

ASP.NET Forms Auth Разрешение доступа к определенному файлу в подкаталоге, когда все остальные должны быть отказаны

У меня возникают проблемы, позволяющие определенной роли получить доступ к определенной странице в подкаталоге.

В моем приложении ASP.NET есть каталог ~/Forms/Administration, который имеет ограниченный доступ. Существует определенный файл ~/Forms/Administration/Default.aspx, который я хочу предоставить 1 дополнительный пользовательский доступ к роли, а также роль администратора.

В ~/Forms/Administration у меня есть файл web.config, который выглядит следующим образом:

   <?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>

Пользователь Admin работает отлично, но дополнительный пользователь всегда терпит неудачу. Я пробовал несколько вещей - перечисление местоположения как

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

И как

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

Является ли deny = "*" из первого общего правила, имеющего прецедент? Я попытался изменить

<deny users="*"/>

Для

<deny users="?"/>

Но это приводит к тому, что AccessUnder предоставляет доступ ко всему. Предложения?

EDIT: я попытался помещать конкретное местоположение, чтобы разрешить правило общего отказа, в случае, если это имеет значение. Такая же проблема.

UPDATE: я явно пропустил что-то здесь: я удалил конфигурацию deny * и оставил только раздел, определяющий местоположение. Затем, вместо того, чтобы разрешать определенные роли, я установил, что нужно отказать всем (*). Тем не менее, он не отрицает меня вообще, когда я вхожу в систему. Я даже уменьшил правило, чтобы оно не было специфичным для файла, но применимо ко всему каталогу, и это не отрицает меня. Однако исходные правила, не относящиеся к местоположению, действительно работают, поэтому я знаю, что этот файл конфигурации читается.

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

Ответ 1

Две вещи:

  • Местоположение относится к файлу web.config, поэтому, если ваш web.config уже включен в /Forms/Administration, его следует исправить следующим образом:

    <location path="Default.aspx">
        <system.web>
            <authorization>
                <allow roles="Administrator, User, AdditionalUser" />
            </authorization>
        </system.web>
    </location>
    
  • Чтобы уточнить порядок разрешений и запретов, авторизация будет применяться на основе первого совпадения, которое он находит, поэтому порядок очень важен. Например:

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

Администратору будет отказано, поскольку он соответствует первой записи об отказе... даже если вы указали, чтобы разрешить пользователю Администратора следующую строку. Чтобы разрешить администратору только правильный синтаксис:

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

В резюме

Если я читаю, что вы хотите правильно, это, вероятно, конечный продукт, который вы хотите:

<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>