Аутентификация LDAP в ASP.Net MVC

Я хочу иметь возможность аутентифицировать пользователя, используя его идентификатор домена и пароль, но приложение ASP.Net MVC по умолчанию позволяет пользователю зарегистрировать идентификатор пользователя и пароль, а затем войти в систему. Как я могу это сделать?

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

Решения, которые я видел (например, здесь, в блоге Майка ) не требуется, чтобы пользователь вводил свой идентификатор пользователя или пароль.

Как мне заставить мое приложение ASP.Net MVC отображать форму входа в систему и аутентифицировать пользователя в домене Windows?

Пожалуйста, объясните с образцом, если это возможно

26 голосов | спросил user99513 9 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 09 Sep 2009 23:42:21 +0400 2009, 23:42:21

5 ответов


0

Вот как это сделать при аутентификации форм веб-приложений, поэтому может потребоваться некоторая адаптация к MVC. Используйте механизм членства и ролей asp.net. Настройте поставщика для использования поставщика членства в Active Directory И ТАКЖЕ используйте формы для проверки подлинности.

<authentication mode="Forms">
  <forms name=".ADAuthCookie" 
         timeout="10"                     
         loginUrl="Login.aspx" 
         defaultUrl="Default.aspx">            
  </forms>

или что-то в этом роде ....

Настройка провайдера будет выглядеть примерно так:

<membership defaultProvider="DomainLoginMembershipProvider">
  <providers>
    <add name="DomainLoginMembershipProvider"           
             type="System.Web.Security.ActiveDirectoryMembershipProvider, System.Web, Version=2.0.0.0,Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"           
         connectionStringName="ADConnectionString"
         connectionProtection="Secure"
         connectionUsername="domainuser"
         connectionPassword="pwd"
         attributeMapUsername="sAMAccountName" 
         enableSearchMethods="false"/>
  </providers>
</membership>

Защита соединения, имя пользователя и pwd предназначены для учетной записи, которая имеет доступ к запросу AD от имени системы. В зависимости от безопасности вашей сети это может потребоваться настроить, иначе вы не сможете запросить AD для аутентификации пользователя.

Строка подключения будет выглядеть примерно так:

<connectionStrings>
  <add name="ADConnectionString"
       connectionString="LDAP://servername:port#/DC=domainname"/>
</connectionStrings>

Строка подключения может принимать различные формы, поэтому вам, возможно, придется исследовать ее для вашей среды.

Для страницы входа в систему вам может потребоваться выполнить метод аутентификации и проверить ...

    e.Authenticated = Membership.ValidateUser(username, password);
    if (e.Authenticated == false)...

Книга Стивена Шакоу «Профессиональная безопасность ASP.Net 2.0, членство и управление ролями» хорошо освещает использование членства в AD (глава 12). Это не в контексте MVC, но конфигурация и настройка будут одинаковыми.

ответил klabranche 10 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 10 Sep 2009 00:05:51 +0400 2009, 00:05:51
0

спасибо, что указали мне правильное направление, это то, что я в итоге сделал

        <authentication mode="Forms">
              <forms loginUrl="~/Account/LogOn" timeout="10"/>
        </authentication>                  

 public bool ValidateUser(string userName, string password)
        {
            bool validation;
            try
            {
                LdapConnection ldc = new LdapConnection(new LdapDirectoryIdentifier((string)null, false, false));
                NetworkCredential nc = new NetworkCredential(userName, password, "DOMAIN NAME HERE");
                ldc.Credential = nc;
                ldc.AuthType = AuthType.Negotiate;
                ldc.Bind(nc); // user has authenticated at this point, as the credentials were used to login to the dc.
                validation = true;
            }
            catch (LdapException)
            {
                validation = false;
            }
            return validation;
        }

Мне не нравится тот факт, что я использую catch в блоке try, чтобы определить, была ли проверка пользователей успешной, но я не мог найти другой способ обойти это.

ответил user99513 10 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 10 Sep 2009 01:45:11 +0400 2009, 01:45:11
0

Я думаю, вы неправильно понимаете сообщение в блоге, на которое ссылались. Идентификатор пользователя и пароль, указанные в файле web.config, являются теми, которые используются ActiveDirectoryMembershipProvider для подключения к AD, а не теми, которые предоставляет пользователь. По сути, он говорит, что нужно поменять поставщика членства SQL на поставщика членства AD и использовать написанный код, чтобы заставить его работать с AD. Это именно то, что вам нужно сделать. Если вы вообще не хотите использовать код поставщика членства, вы можете использовать PrincipalContext.ValidateCredentials в главном контексте интересующего домена для проверки учетных данных, переданных в метод Login.

using (PrincipalContext context = new PrincipalContext( ContextType.Domain, "domain" )) {
    if (context.ValidateCredentials( username, password))
    {
        // log them in
    }
    else
    {
       // set up error message and rerender view
    }
}
ответил tvanfosson 9 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 09 Sep 2009 23:53:54 +0400 2009, 23:53:54
0

LdapConnection является членом пространства имен System.DirectoryServices.Protocols (и вы должны добавить библиотеку System.DirectoryServices.Protocols к вашим ссылкам)

ответил Jan Šotola 27 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 27 Sep 2010 19:33:03 +0400 2010, 19:33:03
0

Я не смог найти System.Web.Security.ActiveDirectoryMembershipProvider.dll где найти? также я ищу в членстве & я нашел это

<membership defaultProvider="LdapMembershipProvider">
    <providers>
        <add name="LdapMembership"
            type="Microsoft.Office.Server.Security.LDAPMembershipProvider,
            Microsoft.Office.Server,
            Version=12.0.0.0, Culture=neutral,
            PublicKeyToken=71E9BCE111E9429C"
            server="DC"
            port="389"
            useSSL="false"
            userDNAttribute="distinguishedName"
            userNameAttribute="sAMAccountName"
            userContainer="CN=Users,DC=userName,DC=local"
            userObjectClass="person"
            userFilter="(|(ObjectCategory=group)(ObjectClass=person))"
            scope="Subtree"
            otherRequiredUserAttributes="sn,givenname,cn"/>
    </providers>
</membership>
ответил Hanaa 14 MonEurope/Moscow2009-12-14T19:17:44+03:00Europe/Moscow12bEurope/MoscowMon, 14 Dec 2009 19:17:44 +0300 2009, 19:17:44

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132