EnableCrossAppRedirects - где документирована междоменная функция? - PullRequest
8 голосов
/ 23 августа 2011

Вот интересная особенность ASP.NET FormsAuthentication, объясненная в этом ответе SO: Как вы проходите аутентифицируемый сеанс между доменами приложения

Краткое резюме;Вы можете создать два сайта ASP.NET с одинаковыми ключами шифрования.WebsiteA может создать токен Formauth и перенаправить на WebsiteB с токеном в строке запроса (или теле POST).Включите EnableCrossAppRedirects на WebsiteB, и ASP.NET обнаружит токен и создаст cookie-файл формы.В коде:

FormsAuthentication.RedirectFromLoginPage("alice", true);
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket("Alice", true, 30);
string encrypted = FormsAuthentication.Encrypt(ticket);
Response.Redirect("http://siteb.dev/Secure/WebForm1.aspx?" + FormsAuthentication.FormsCookieName + "=" + encrypted);

Звучит как отличная функция, но где это задокументировано?Я бы чувствовал себя неловко с битом , используя недокументированную функцию.

Где я смотрел - нет упоминания об этой функции ни в одном из справочников MSDN.Я думал, что, возможно, RedirectFromLoginPage создаст перенаправление, как мой код выше, это не так.

1 Ответ

15 голосов
/ 30 августа 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...