Посмотрев на отражатель, я обнаружил (несколько недокументированную) особенность аутентификации форм.Когда EnableCrossAppRedirects
включен, .NET, в дополнение к поиску файла cookie для аутентификации, попытается извлечь файл cookie для проверки подлинности форм либо из сообщения формы, либо из строки запроса.Этот код встроен в класс FormsAuthentication
в методе ExtractTicketFromCookie
, где ясно видно, как он пытается найти файл cookie аутентификации в данных запроса.
if (FormsAuthentication.EnableCrossAppRedirects)
{
text = context.Request.QueryString[name];
if (text != null && text.Length > 1)
{
if (!cookielessTicket && FormsAuthentication.CookieMode == HttpCookieMode.AutoDetect)
{
cookielessTicket = CookielessHelperClass.UseCookieless(context, true, FormsAuthentication.CookieMode);
}
try
{
formsAuthenticationTicket = FormsAuthentication.Decrypt(text);
}
catch
{
flag2 = true;
}
if (formsAuthenticationTicket == null)
{
flag2 = true;
}
}
if (formsAuthenticationTicket == null || formsAuthenticationTicket.Expired)
{
text = context.Request.Form[name];
if (text != null && text.Length > 1)
{
if (!cookielessTicket && FormsAuthentication.CookieMode == HttpCookieMode.AutoDetect)
{
cookielessTicket = CookielessHelperClass.UseCookieless(context, true, FormsAuthentication.CookieMode);
}
try
{
formsAuthenticationTicket = FormsAuthentication.Decrypt(text);
}
catch
{
flag2 = true;
}
if (formsAuthenticationTicket == null)
{
flag2 = true;
}
}
}
}
Поэтому, если вы включите EnableCrossAppRedirects
в обоих приложениях первое приложение авторизуется для перенаправления на внешний сайт, а второе приложение автоматически считывает файл cookie аутентификации из запроса.Вам просто нужно сконструировать его так, чтобы обратный URL-адрес входа либо отправлял данные cookie, либо отправлял их в строке запроса.Вы также должны быть уверены, что либо ключи компьютера синхронизированы, либо что файл cookie зашифрован с использованием ключа компьютера внешнего приложения (первым приложением).Кажется, по умолчанию .NET отправит зашифрованный куки-файл аутентификации в строку запроса для вас и предположит, что ваши ключи машины синхронизированы (см. Цитату MSDN ниже).
Вот еще немного информации о MSDN .
Если свойство CookiesSupported имеет значение true и либо переменная ReturnUrl находится в текущем приложении, либо свойство EnableCrossAppRedirects имеет значение true, то метод RedirectFromLoginPage выдает билет проверки подлинности и помещает его в файл cookie по умолчанию, используяметод SetAuthCookie.
Если CookiesSupported имеет значение false и путь перенаправления - к URL-адресу в текущем приложении, билет выдается как часть URL-адреса перенаправления. Если CookiesSupported имеет значение false, EnableCrossAppRedirects имеет значение true, а URL-адрес перенаправления не ссылается на страницу в текущем приложении, метод RedirectFromLoginPage выдает билет проверки подлинности и помещает его в свойство QueryString .
Есть большое предупреждение о влиянии на безопасность.EnableCrossAppRedirects
- это параметр безопасности, который предотвращает перенаправление элементов управления входом ASP.NET на внешний URL-адрес возврата (другое веб-приложение).Если этот параметр включен, его можно использовать при некоторых формах атаки - пользователь отправляется на официальную страницу входа, но при входе в систему перенаправляется в другое приложение, которое, по их мнению, может быть одинаковым.Вот почему он отключен по умолчанию.
Один из способов помочь уменьшить это при включении этой функции заключается в следующем:
Чтобы повысить безопасность при использовании перенаправлений между приложениями, необходимо переопределитьметод RedirectFromLoginPage, позволяющий перенаправлять только на утвержденные веб-сайты.
Вам также необходимо убедиться, что запрос перенаправления обслуживается через SSL, чтобы защитить «cookie» при передаче, поскольку любой перехватывающий сможет получитьконтроль аккаунта.