Краткая версия:Пользовательское MembershipProvider с таблицей SQL пользователей
Как использовать пользовательский поставщик членства, который проверяет пользователь от нескольких доменов с базой данных пользователей SQL таким образом, что пользователь сначала войти в, вход в база данных пользователей будет сделана со всей необходимой информацией? Есть ли способ изменить часть информации, которая поступает из AD, прежде чем она войдет в базу данных SQL, как в синтаксическом анализе некоторых полей?
Long Version:
Я работаю на веб-приложение MVC4, который дает мне головную боль. Пользователи будут регистрироваться в двух доменах (dc = domainone, dc = company, dc = com) и (dc = domaintwo, dc = company, dc = com). Первый домен является относительно стандартным доменом, насчитывающим около 1000 пользователей. Ничего особенного. Во втором домене есть два типа пользователей: те, у которых есть «живой» пароль (около 100 пользователей), что означает, что пользователь может напрямую аутентифицироваться в домене, а также те, у кого есть пароль, который хранится как соленый хеш в дополнительном поле в каталоге (более 200 000 пользователей). Для этих последних пользователей я должен захватить сохраненный соленый хэш из каталога, хешировать пароль, который они вводят при входе в систему и сравнивать их. У меня аутентификация работает без проблем в пользовательском MembershipProvider ниже.
Однако таблица моих пользователей в SQL не заполняется информацией пользователя при входе в систему. Мне необходимо использовать базу данных SQL для таблицы пользователя, а не только информацию AD, поскольку есть несколько необходимых полей в пределах AD, которые не могут использоваться моим приложением, не будучи сначала разобранными. Например, поле employeeNumber может иметь «12345» для Джейн Смит, и это поле может быть пустым для Джо Смита, его номер сотрудника является частью их DN, как в DN = «CN = Joe Smith < # 1234>, DC = domainone, DC = компания, DC = ком»
MembershipProviderpublic override bool ValidateUser(string username, string password)
{
CompanyAuthenticationService connectionToAD = new CompanyAuthenticationService();
//Test US domain log in first
if (connectionToAD.ValidateAgainstAD(username, password,"domainone"))
return true;
//Test Team domain log in next
if (connectionToAD.ValidateAgainstAD(username, password,"domaintwo"))
return true;
//Test Team Hash last
if (connectionToAD.ValidateAgainstTeamHash(username, password))
return true;
return false;
}
//all other methods are not implemented
web.config
// Несколько линий Усеченного
<connectionStrings>
<add name="ProgramNameDB"
connectionString="data source=.\SQLEXPRESS;Integrated Security=True;Initial Catalog=ProgramName"
providerName="System.Data.SqlClient" />
</connectionStrings>
// Несколько строк усечены
<authentication mode="Forms">
<forms loginUrl="/Account/Login" timeout="30"/>
</authentication>
// Несколько строк усечен
<profile defaultProvider="DefaultProfileProvider">
<providers>
<add name="DefaultProfileProvider" type="System.Web.Providers.DefaultProfileProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="ProgramNameDB" applicationName="/" />
</providers>
</profile>
<membership defaultProvider="ProgramNameMembershipProvider">
<providers>
<clear/>
<add name="ProgramNameMembershipProvider"
type="ProgramName.Services.Security.MembershipProviders.ProgramNameMembershipProvider" />
</providers>
</membership>
<roleManager defaultProvider="ProgramNameRoleProvider" cacheRolesInCookie="true" enabled="true" cookieTimeout="120" createPersistentCookie="false">
<providers>
<add name="ProgramNameRoleProvider" type="ProgramName.Services.Security.RoleProviders.ProgramNameRoleProvider" connectionStringName="ProgramNameDB" applicationName="/" />
</providers>
</roleManager>
После проверки, пользователи не могут автоматически получить добавлено в базу данных в качестве новой учетной записи через API членства, является то, что вы ожидали? –
Да. Я новичок в ASP.Net. Существуют ли другие методы, которые я должен реализовать и вызывать? Если да, то где? – mckennawebdev
Чтобы создать нового пользователя, вызовите Memberhip.CreateUser, который вызывает метод CreateUser провайдера, упомянутый в моем сообщении ниже. –