ASP.NET Forms Auth Разрешение доступа к определенному файлу в подкаталоге, когда все остальные должны быть запрещены - PullRequest
13 голосов
/ 15 октября 2010

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

В моем приложении 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 работает нормально, но AdditionalUser всегда дает сбой.Я пробовал несколько вещей - перечисление местоположения как

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

И как

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

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

<deny users="*"/>

на

<deny users="?"/>

Но в итоге получило от AdditionalUser доступ к всему .Предложения?

РЕДАКТИРОВАТЬ: я пытался поместить разрешение для конкретного местоположения перед универсальным правилом запрета, если порядок имеет значение.Та же проблема.

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

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

1 Ответ

20 голосов
/ 15 октября 2010

Две вещи:

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

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

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

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

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