Проверка подлинности с помощью форм - PullRequest
8 голосов
/ 21 августа 2008

Я работаю над внутренним веб-инструментом для моей компании. Частью этого инструмента является другое приложение (Панель управления круиз-контролем), которое работает в своем собственном виртуальном каталоге под моим корневым приложением.

Я хотел ограничить доступ к этому внутреннему приложению, настроив на нем проверку подлинности с помощью форм и имея форму входа в систему в корневом приложении.

Я поместил следующее в корневые приложения web.config:

<location path="ccnet">
  <system.web>
    <authentication mode="Forms">
        <forms loginUrl="/default.aspx" timeout="5000"/>
    </authentication>
    <authorization>
      <allow users="?"/>
      <deny users="?"/>
    </authorization>        
  </system.web>    
</location>

Однако проверка подлинности с помощью форм не работает, она не перенаправляет обратно на страницу входа в систему при непосредственном доступе к этому приложению.

У меня такое ощущение, что теги и установлены неправильно. Может кто-нибудь уточнить?

Ответы [ 8 ]

8 голосов
/ 21 августа 2008

Вам также может понадобиться указать путь = "/" в

Вот и все!

Итак, Резюме, чтобы сделать это;

В корень web.config добавьте:

<machineKey validationKey="AutoGenerate" decryptionKey="AutoGenerate" validation="SHA1" />

Это необходимо сделать, потому что по умолчанию это «AutoGenerate, IsolateApps».

Во-вторых, вы должны называть форму Auth cookie одинаковыми в обоих, я сделал все это в своем корне, используя тег location:

<authentication mode="Forms">
   <forms name="ccAuth" loginUrl="/default.aspx"  path="/" timeout="5000"/>
</authentication>
<authorization>
   <deny users="?"/>
</authorization>

Наконец:

<location path="ccnet">
  <system.web>
    <authentication mode="Forms">
      <forms name="ccAuth" loginUrl="/default.aspx"  path="/" timeout="5000"/>
    </authentication>
    <authorization>
      <deny users="?"/>
    </authorization>      
  </system.web>    
</location>

Спасибо всем за вашу помощь. Это был тупик.

2 голосов
/ 21 августа 2008

FormsAuthentication шифрует токены, которые он дает пользователю, и по умолчанию шифрует ключи, отличающиеся для каждого приложения. Чтобы заставить Forms Auth работать в разных приложениях, вам нужно сделать несколько вещей:

Во-первых, задайте «имя» Auth Forms для всех приложений. Это делается с помощью:

<authentication mode="Forms">  
    <forms name="{name}" path="/" ...>
</authentication>

Установите одинаковое имя в обоих приложениях web.configs.

Во-вторых, вы должны указать обоим приложениям использовать один и тот же ключ при шифровании. Это немного сбивает с толку. Когда я настраивал это, все, что мне нужно было сделать, это добавить следующее в оба файла web.configs:

<machineKey validationKey="AutoGenerate" decryptionKey="AutoGenerate" validation="SHA1" />

Согласно документам, это значение по умолчанию, но оно не работало для меня, пока я не указал его.

1 голос
/ 21 августа 2008

Возможно, вам также понадобится указать путь = "/" в тегах

0 голосов
/ 16 января 2017

Ни одно из вышеперечисленных предложений не помогло мне. Получается в корневом наборе web.config:

<forms loginUrl="/pages/login.aspx" enableCrossAppRedirects="true"...

и убедитесь, что корневое и дочернее приложения находятся в system.web

<machineKey validationKey="AutoGenerate" decryptionKey="AutoGenerate" validation="SHA1"/>

, который отключает IsolateApps по умолчанию.

Тогда все просто сработало!

0 голосов
/ 28 ноября 2008

Какое расширение файла для этого приложения круиз-контроля? Если это не тот тип файлов, который ASP.NET регистрирует для обработки (например, jsp, java и т. Д.), То ASP.NET не будет действовать как механизм аутентификации (в IIS 5 и 6). Например, для статических html-файлов, если не реализовано сопоставление с подстановочными знаками, IIS выполняет всю аутентификацию и авторизацию и обслуживает файл без использования расширения isapi ASP.NET. IIS7 может использовать новый интегрированный режим конвейера для перехвата всех запросов. Для IIS6 вы можете посмотреть статью Скотта Гу по этому вопросу .

0 голосов
/ 21 августа 2008

Где этот код сидит Джонатан? По моему опыту, у меня есть контроль входа в систему и в событии OnAuthenticate я бы установил для Authenticated значение false ...

If CustomAuthenticate(Login1.UserName, Login1.Password) Then
    FormsAuthentication.RedirectFromLoginPage(Login1.UserName, False)
Else
    e.Authenticated = False
End If

Но это использует Microsoft Way

0 голосов
/ 21 августа 2008

Это не работает, но все равно разрешает доступ всем пользователям (аутентифицированным или нет).

Я думаю, вы могли бы даже опустить тег allow, поскольку он избыточен. Просто:

<deny users="?"/>
0 голосов
/ 21 августа 2008

вы разрешаете все без проверки подлинности. Возможно, вы ищете что-то вроде этого

<deny users="?"/>
...