ASP.NET смешанные формы/проверка подлинности Windows

В настоящее время я разрабатываю веб-приложение MVC3, которое требует от пользователей экстрасети входа в систему и проверки подлинности с использованием проверки подлинности с помощью форм. Пользователи внутренней сети должны автоматически регистрироваться с помощью проверки подлинности Windows.
Я нашел эту статью, http://aspalliance.com/553_Mixed_Mode_Authentication.all но он датирован нояб. 2004 года и хотел найти что-то написанное совсем недавно, чем 7 лет назад.

Мой план состоит в том, чтобы иметь два приложения в IIS, с виртуальными каталогами, указывающими на один и тот же физический каталог, но один из них позволит анонимному доступу, а другой не будет.

Когда пользователь аутентифицируется на стороне Windows/Intranet, я надеюсь просто смоделировать регистрацию пользователя через проверку подлинности форм. Есть ли подводные камни для этого подхода? Любые лучшие идеи?

EDIT: 7/22/2011

Я использую IIS7, который не позволит мне делать много вещей, предложенных в старых статьях. Из-за того, что аутентификация становится более сложной между IIS7 и веб-сайтами ASP.NET, некоторые вещи не допускаются. Например, я не могу установить Windows Auth на один файл, в то время как остальная часть приложения использует Forms Auth.

Ответ 1

Удивительно, что лучший подход здесь не будет состоять из двух приложений, в которых первое приложение использует проверку подлинности Windows и состоит исключительно из привязки к событию PostAuthenticate в конвейере HTTP. Если пользователь аутентифицирован, вы даете им билет формы и перенаправляете на целевое приложение App2, которое использует проверку подлинности на основе форм. Вы должны быть осторожны, чтобы файлы cookie не были специфичными для пути, а также что эти два приложения находятся на одном сервере (или что ключи шифрования синхронизированы в web.config). Если пользователь не аутентифицирован, вы просто перенаправляете его без авторизационного билета, и они заходят в систему при поступлении в App2.

App1: www.myUrl.com\MyApp

Это "общедоступный" URL-адрес приложения и обнаруживает пользователей сети, подключаясь к событию PostAuthenticate (см. Профессиональная защита ASP.NET 2.0, членство и Управление ролями):

//Hook PostAuthenticateRequest inside of global.asax
void Application_PostAuthenticateRequest(Object sender, EventArgs e)
{
    IPrincipal p = HttpContext.Current.User;

    if (p.Identity.IsAuthenticated)
    {
      // to do: give them a non-path specific ticket and redirect to App2
    }
}

App2: www.myUrl.com\MyApp2

Это фактическое приложение. Когда пользователи сети приходят из App1, у них уже будет билет на формы. Когда не-сетевые пользователи прибудут, они будут перенаправлены на login.aspx.

Примечания: Одним из недостатков этого было бы, если бы пользователи сети заходили в App2. Я не совсем уверен, как мне обойти это. Если у них есть неиспользуемый файл cookie, это не имеет большого значения. Один из вариантов заключается в том, чтобы поместить ссылку на страницу входа в систему, которая говорит что-то вроде "Я уже являюсь сетевым пользователем - зарегистрируйте меня автоматически", который будет ссылаться на App1, где они войдут в систему?

У меня есть код, который поможет в выдаче билета форм. Я буду обновлять ответ, поскольку у меня есть время.

Обратите внимание, что вам нужно будет сделать некоторые причудливые функции управления ролью в App2 для обработки разрозненных поставщиков роли. Эта ссылка Amazon выше, но я постоянно обращаюсь к ней, когда сталкиваюсь с такими проблемами аутентификации и авторизации.

Ответ 2

Это вполне возможно, если вы создадите два разных приложения в IIS, чтобы ваша работа была выполнена! =)