Я работаю над внутренним веб-инструментом для своей компании. Частью этого инструмента является другое приложение (Панель управления круиз-контролем), которое работает в собственном виртуальном каталоге под моим корневым приложением.
Я хотел ограничить доступ к этому внутреннему приложению, настроив для него проверку подлинности с помощью форм и имея форму входа в корневое приложение.
Я поместил в корневые приложения 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>
Однако проверка подлинности с помощью форм не работает, она не перенаправляет обратно на страницу входа, когда я напрямую обращаюсь к этому приложению.
Такое ощущение, что у меня





вы разрешаете все без аутентификации. Возможно, вы ищете что-то вроде этого
<deny users = "?"/>
That does not work, it still allows all users, (Authenticated or not) to access.
Я бы подумал, что вы даже можете опустить тег allow, поскольку он избыточен. Только:
<deny users = "?"/>
FormsAuthentication шифрует токены, которые он дает пользователю, и по умолчанию он шифрует ключи, разные для каждого приложения. Чтобы заставить Forms Auth работать в разных приложениях, вам нужно сделать несколько вещей:
Во-первых, задайте одинаковое «имя» для Forms Auth для всех приложений. Это делается с помощью:
<authentication mode = "Forms">
<forms name = "{name}" path = "/" ...>
</authentication>
Установите одинаковое "имя" в обоих приложениях web.configs.
Во-вторых, вам нужно указать обоим приложениям использовать один и тот же ключ при шифровании. Это немного сбивает с толку. Когда я настраивал это, все, что мне нужно было сделать, это добавить следующее в оба файла web.configs:
<machineKey validationKey = "AutoGenerate" decryptionKey = "AutoGenerate" validation = "SHA1" />
Согласно документации, это значение по умолчанию, но оно не сработало для меня, если я не указал его.
Где этот код сидит, Джонатан? По моему опыту, у меня есть элемент управления входом, и в событии OnAuthenticate я бы установил для Authenticated значение false ...
If CustomAuthenticate(Login1.UserName, Login1.Password) Then
FormsAuthentication.RedirectFromLoginPage(Login1.UserName, False)
Else
e.Authenticated = False
End If
Но это с использованием Microsoft Way
You might also need to put path = "/" in the
Вот и все!
Итак, Резюме, чтобы сделать это;
В корень web.config добавить:
<machineKey validationKey = "AutoGenerate" decryptionKey = "AutoGenerate" validation = "SHA1" />
Это необходимо сделать, потому что по умолчанию это «AutoGenerate, IsolateApps».
Во-вторых, вы должны назвать форму Auth cookie одинаково в обоих случаях, я сделал все это в своем корне, используя тег местоположения:
<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>
Спасибо всем за вашу помощь. Это было непросто.
Какое расширение файла у этого приложения круиз-контроля? Если ASP.NET зарегистрирован для обработки не того типа файла (например, jsp, java и т. д.), То ASP.NET не будет действовать как механизм аутентификации (в IIS 5 и 6). Например, для статических файлов HTML, если у вас не реализовано сопоставление с подстановочными знаками, IIS выполняет всю проверку подлинности и авторизацию и обслуживает файл без использования расширения isapi ASP.NET. IIS7 может использовать новый интегрированный конвейерный режим для перехвата всех запросов. Для IIS6 вам нужно посмотреть Статья Скотта Гу по этому поводу.
Ни одно из приведенных выше предложений не помогло мне. Получается в корневом наборе web.config:
<forms loginUrl = "/pages/login.aspx" enableCrossAppRedirects = "true"...
и убедитесь, что и у корневого, и у дочернего приложения есть в system.web
<machineKey validationKey = "AutoGenerate" decryptionKey = "AutoGenerate" validation = "SHA1"/>
который отключает IsolateApps по умолчанию.
Тогда все просто заработало!
МОЙ БОГ! IsolateApps в элементе machineKey! спасибо спасибо, мои волосы теперь могут отрасти :)