2012-06-05 2 views
1

Краткая версия:Пользовательское 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 = ком»

MembershipProvider
public 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> 
+0

После проверки, пользователи не могут автоматически получить добавлено в базу данных в качестве новой учетной записи через API членства, является то, что вы ожидали? –

+0

Да. Я новичок в ASP.Net. Существуют ли другие методы, которые я должен реализовать и вызывать? Если да, то где? – mckennawebdev

+0

Чтобы создать нового пользователя, вызовите Memberhip.CreateUser, который вызывает метод CreateUser провайдера, упомянутый в моем сообщении ниже. –

ответ

1

Вы должны вызвать метод Membership.CreateUser для создания нового пользователя. Вы можете поместить это в метод ValidateUser или в событие LoggedIn входа в систему входа. Очевидно, что вы хотите сначала проверить, что зарегистрированный пользователь уже существует или нет в базе данных перед вызовом CreateUser ...

Более подробную информацию о мероприятии LoggedIn: http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.login.loggedin.aspx

Смежные вопросы