ASP.NET 4.0 Единый вход между родительским веб-сайтом и дочерним веб-приложением завершается неудачно - PullRequest
2 голосов
/ 08 октября 2011

У меня есть следующая структура

www.website.com -> Веб-сайт ASP.NET 4.0

www.website.com / blog -> NET 4.0,Веб-приложение

Оба выполняют проверку подлинности на основе формы для одной и той же базы данных SQL и используют рамки членства и роли ASP.NET.Я могу войти в каждую часть просто отлично (тот же пользователь / пароль), но аутентификация не переносится, т. Е. Если я войду в /, а затем щелкните ссылку на /blog/, /blog/ думает, что я анонимный и предлагаетдля входа снова.Я сделал основы

, т.е.

  1. Идентичные <authentication mode="Forms"> как на сайте, так и в приложении web.configs
  2. Идентичные <machineKey> раздел (да, идентичные validationKey и decryptionKey)

Итак, я проверил сгенерированные файлы cookie и заметил, что веб-приложение и веб-приложение работают с разными файлами cookie.

Файлы cookie, созданные website.com/ blog

  • .ASPXFORMSAUTH-27604f05-86ad-47ef-9e05-950bb762570c
  • .ASPXROLES

Файлы cookie, созданные website.com

  • .ASPXFORMSAUTH

Я думаю, что это проблема, хотя я вижу ее, несмотря на идентичные <authentication> разделы, которые выглядят как

<authentication mode="Forms">
    <forms timeout="30" slidingExpiration="true" name=".ASPXFORMSAUTH" enableCrossAppRedirects="true" protection="All" cookieless="UseCookies"/>
</authentication>

Я читал несколькодругие сообщения, такие как единый вход с проверкой подлинности с помощью форм , а также http://msdn.microsoft.com/en-us/library/eb0zx8fc.aspx

Были также несколько других сообщений, которые я не могу вспомнить сейчас.Я прошел через них (все?), Но все еще застрял.Я могу с радостью предоставить больше отладочных данных, если необходимо.

Буду очень признателен за любые советы, которые могут быть у кого-то!Я думаю, что я бью стену на этом!

Ответы [ 2 ]

2 голосов
/ 11 октября 2011

Хорошо, так что я смог ответить на свой вопрос после того, как долго обдумывал его.

По сути, BlogEngine.NET 2.5 (мое веб-приложение), похоже, переопределяет способ работы платформы .NET 4.0. Есть пара вещей, которые нужно исправить, все в BlogEngine.Core \ Security \ Security.cs (скачать исходный код BlogEngine.NET)

Часть 1: Исправить имя файла cookie

В нем есть метод FormsAuthCookieName, который я изменил следующим образом:

File: BlogEngine.Core\Security\Security.cs
Method: FormsAuthCookieName()
// return FormsAuthentication.FormsCookieName + "-" + Blog.CurrentInstance.Id.ToString();
return FormsAuthentication.FormsCookieName;

Это гарантирует, что имена файлов cookie совпадают. Одно препятствие ...

Часть 2. Избегайте веб-приложений / страницы входа BlogEngine.NET / элементы управления / код

Вместо того, чтобы направлять пользователей в логин BlogEngine.Net login.aspx (www.website.com \ blog \ account \ login.aspx), я указал все ссылки для входа в систему на моем главном сайте login.aspx. страница (www.website.com \ login.aspx). Если вам интересно, как реализовать собственную собственную аутентификацию по всему сайту, это супер-краткое руководство

msdn.microsoft.com/en-us/library/ff184050.aspx. 

Мне также пришлось добавить что-то подобное и на веб-сайт web.config, и на веб-приложение web.config, чтобы каждый раз, когда к защищенному ресурсу обращался (с веб-сайта или веб-приложения), мой собственный глобальный / login / aspx используется.

<authentication mode="Forms">
<forms timeout="30" loginUrl="/login.aspx" blah blah />
</authentication>

Теперь мои собственные общие элементы управления входом в систему для всего сайта будут создавать файлы cookie аутентификации (стандарта .NET Framework) и файлы cookie роли (пользователя). Избегая login.aspx в BlogEngine.NET, мы становимся чище, и мы избегаем называть этот код проблематичным.

File: BlogEngine.Core\Security\Security.cs
Method: AuthenticateUser(string username, string password, bool rememberMe)

Подробности: Этот код добавляет «экземпляр блога» в файл cookie, поэтому, если у вас есть несколько блогов в одном домене, это предотвращает автоматическую аутентификацию пользователя user1 на экземпляре блога 1. аутентифицировано в экземпляре блога 2. Я предполагаю, что у большинства будет только один блог на домен (www.domain.com \ blog!), так что это не нужно. Что еще более важно, эта проверка нарушает нашу единую регистрацию.

Два препятствия вниз ...

Часть 3. Исправление проверки авторизации для доступа

Теперь наш стандартизированный login.aspx не добавляет специфический идентификатор экземпляра BlogEngine.NET (см. Выше). Это было бы хорошо, за исключением того, что есть еще некоторый код BlogEngine.NET, который специально ищет это. Нам также не нужна эта проверка, поэтому давайте удалим эту оскорбительную проверку ...

File: BlogEngine.Core\Security\Security.cs
Method: void Init(HttpApplication context)
// Comment line below to revert to only-framework/default processing
//context.AuthenticateRequest += ContextAuthenticateRequest;

Так что на данный момент у вас должно быть

  • Все логины обрабатываются одним логином, доступным для всего сайта. ASPX
  • Все куки-файлы аутентификации и куки-файлы ролей пользователей, созданные вышеупомянутым сайтом wide login.aspx
  • Все такие файлы cookie зашифрованы и защищены как для веб-сайта, так и для веб-приложения web.configs (которые должны совпадать!)

Что, в свою очередь, позволяет использовать единый вход :) !! Ура!

1 голос
/ 07 января 2013

Кроме того: в оба файла web.configs необходимо вставить машинный ключ с тем же ключом validationKey и тем же ключом decryptionKey.

...