ASP.Net MVC 3 Логин и проверка подлинности Windows - PullRequest
9 голосов
/ 06 декабря 2011

Я работаю над приложением ASP.Net MVC 3, и у меня есть таблица User, в которой хранятся имена пользователей и их пароли. Я создал дополнительное имя ADUser (хранит домен / имя пользователя Active Directory).

Я пытаюсь сделать следующее:

  1. Пользователи, запускающие приложение из интрасети, не должны видеть страницу входа. Их домен / имя пользователя должны быть получены автоматически и сопоставлены с полем ADUsername.

  2. Пользователи, работающие с приложением из Интернета (вне локальной сети), или пользователи без значения ADUsername: должны увидеть экран входа в систему и использовать для входа мои пользовательские поля Имя пользователя и Пароль.

Это было очень легко с помощью Visual Studio Development Server и очень трудно с помощью IIS:)

Поскольку я настраиваю свой Web.Config для использования форм, я использую WindowsIdentity.GetCurrent (). Name, чтобы получить текущее имя ADUsername, а затем, я ищу свою таблицу User, чтобы найти пользователя и FormsAuthentication.SetAuthCookie его.

При использовании IIS всегда возвращается пользователь APPPOOL \ ASP.NET v4.0, который не отражает нужный мне домен / пользователя.

Любая помощь?

Ответы [ 2 ]

15 голосов
/ 07 декабря 2011

Это не простая задача для выполнения. Идентификация Windows вашего пользователя в интрасети будет доступна вам, только если включена аутентификация Windows в IIS, анонимная аутентификация отключена. Когда браузер пользователя подключается к серверу, IIS выполняет запрос / ответ NTLM для проверки пользователя. Обратите внимание, что этот запрос / ответ фактически возникает при каждом отдельном HTTP-запросе, а не только один раз.

Проблема с этим механизмом заключается в том, что ваша проверка подлинности с помощью форм больше не будет использоваться, так как она запускается после запуска проверки подлинности Windows, а неудачная проверка подлинности просто вызывает отказ в доступе IIS, а не откат к проверке подлинности с помощью форм.

Чтобы построить гибрид, вам необходимо:

  1. Настройте основное веб-приложение для проверки подлинности пользователей с помощью проверки подлинности с помощью форм. Установите web.config следующим образом. Сгенерируйте свой собственный ключ компьютера - это ключ для обеспечения совместного использования файлов cookie

    <authentication mode="Forms"><forms loginUrl="~/Account/LogOn" timeout="2880" path="/" enableCrossAppRedirects="true" name=".ASPXFORMSAUTH" protection="All"  />
    </authentication>
    <machineKey validationKey="C50B3C89CB21F4F1422FF158A5B42D0E8DB8CB5CDA1742572A487D9401E3400267682B202B746511891C1BAF47F8D25C07F6C39A104696DB51F17C529AD3CABE" decryptionKey="8A9BE8FD67AF6979E7D20198CFEA50DD3D3799C77AF2B72F" validation="SHA1" /> <system.webServer>
    <security>
      <authentication>
        <anonymousAuthentication enabled="true"/>
        <windowsAuthentication enabled="false"/>
      </authentication>
    </security></system.webServer>
    
  2. Создайте новое отдельное веб-приложение, которое будет использоваться исключительно для проверки подлинности NTLM. Это будет авторизовать, а затем перенаправить в основное приложение. Извините, два приложения не могут быть объединены.

  3. В веб-приложении NTLM измените режим аутентификации web.config, как показано ниже:

    <authentication mode="Windows">       
    </authentication>   
    <machineKey validationKey="C50B3C89CB21F4F1422FF158A5B42D0E8DB8CB5CDA1742572A487D9401E3400267682B202B746511891C1BAF47F8D25C07F6C39A104696DB51F17C529AD3CABE"
                decryptionKey="8A9BE8FD67AF6979E7D20198CFEA50DD3D3799C77AF2B72F" validation="SHA1" />
<system.webServer>
    ....
    <security>
      <authentication>
        <windowsAuthentication enabled="true"/>
        <anonymousAuthentication enabled="false"/>
      </authentication>
      <ipSecurity>
        <!-- put whatever here to restrict to your LAN
        <add ..../>
        -->
      </ipSecurity>
    </security>
  </system.webServer>
  1. В веб-приложении NTLM контроллер выполняет одно действие - извлекает имя пользователя из (WindowsPrincipal) Thread.CurrentPrincipal (); и вызывает FormsAuthentication.SetAuthCookie (..). Затем перенаправьте в основное веб-приложение. Не используйте WindowsIdentity.GetCurrent (), так как он не будет точным без включенной имитации [см. Msdn.microsoft.com/en-us/library/ff647076.aspx], которую вы не хотите использовать

  2. Вы не можете проверить это в Cassini или IIS Express; Вы должны использовать IIS 7.5.

  3. Перейдите к IIS 7.5 и включите делегирование функций для «Аутентификация - анонимная» и «Аутентификация - Windows».

  4. Создание приложения IIS для приложения на основе форм

  5. Щелкните правой кнопкой мыши на только что созданном приложении Forms и выберите «Добавить приложение». Укажите путь к приложению для проверки подлинности NTLM и имя, например «IntranetAuthentication»

  6. При доступе через браузер http://localhost/YourSite для проверки подлинности с помощью форм и http://localhost/YourSite/IntranetAuthentication для просмотра проверки подлинности NTLM, а затем повторной проверки подлинности на главном сайте

В вашей компании попросите пользователей интрасети использовать вход в интрасеть. Внешне все используют обычную страницу аутентификации форм.

3 голосов
/ 06 декабря 2011

если вы используете смешанную аутентификацию, почему вы не получаете пользователя AD через контекст?

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