Аутентификация LDAP в ASP.Net MVC
Я хочу иметь возможность аутентифицировать пользователя, используя свой домен UserId и Password, но приложение ASP.Net по умолчанию ASP.NET позволяет пользователю регистрировать userId и пароль, а затем регистрироваться. Как я могу это сделать?
Я не хочу, чтобы пользователь мог зарегистрироваться; однако он должен иметь возможность вводить свой домен пользователя userId и пароль и аутентифицироваться сервером домена.
Решения, которые я видел (например здесь, в Mike Blog), не требуют, чтобы пользователь вводил свой UserId или пароль.
Как я могу заставить приложение ASP.Net MVC показать форму регистрации и аутентифицировать пользователя в домене Windows?
Пожалуйста, объясните с помощью образца, если возможно
Ответы
Ответ 1
Вот как это сделать в аутентификации форм в веб-приложениях, поэтому может потребоваться адаптация для 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, но конфигурация и настройка будут одинаковыми.
Ответ 2
спасибо за то, что указали мне правильное направление, вот что я закончил делать
<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, чтобы определить, была ли проверка пользователей успешной, но я не мог найти другого пути.
Ответ 3
Я думаю, что вы неправильно понимаете сообщение в блоге, на которое вы ссылаетесь. Идентификатор пользователя и пароль, указанные в файле 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
}
}
Ответ 4
Я не смог найти System.Web.Security.ActiveDirectoryMembershipProvider.dll, где найти?
также я ищу в memebership, и я нашел это
<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>
Ответ 5
LdapConnection является членом пространства имен System.DirectoryServices.Protocols
(и вы должны добавить библиотеку System.DirectoryServices.Protocols в свои ссылки)