2015-06-25 11 views
0

Моим требованием приложения является одно приложение & несколько баз данных для каждого клиента. Поэтому я реализовал пользовательское членство для достижения этого. Сначала я проверяю, принадлежит ли пользователь, к какому клиенту в соответствии со строкой подключения этого db клиента я динамически устанавливаю строку подключения &.Я столкнулся с «Ваша попытка входа не была успешной». Повторите попытку. ошибка при внедрении пользовательского членства

Вот мой веб-конфигурации:

<membership defaultProvider="EPMembershipProvider" userIsOnlineTimeWindow="20"> 
    <providers> 
    <clear />  
    <add name="EPMembershipProvider" type="EfficientPeople.GlobalClasses.EPMembershipProvider" connectionStringName="DBEntitiesConnectionString" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="25" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" passwordStrengthRegularExpression="" applicationName="/" /> 
    <!--<add name="EPMembershipProvider" type="EfficientPeople.GlobalClasses.EPMembershipProvider, EfficientPeople" connectionStringName="DBEntitiesConnectionString" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="25" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" passwordStrengthRegularExpression="" applicationName="/" />--> 
    </providers> 
</membership> 

<profile> 
    <providers> 
    <clear /> 
    <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="DBEntitiesConnectionString" applicationName="/" /> 
    </providers> 
</profile> 
<roleManager enabled="true"> 
    <providers> 
    <clear /> 
    <add connectionStringName="DBEntitiesConnectionString" applicationName="/" name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" /> 
    <add applicationName="/" name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" /> 
    </providers> 
</roleManager> 

CustomMembership Класс:

public class EPMembershipProvider : SqlMembershipProvider 
{ 
    public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config) 
    { 
     base.Initialize(name, config); 
     // Update the private connection string field in the base class. 

     Int64 ClientId = Convert.ToInt64(HttpContext.Current.Session["_clientId"]); 
     if (ClientId > 0) 
     { 
      UserLoginML objUL = new UserLoginML(); 

      //string _dbMembershipConnStr = ManageSessionFacade._dbMembershipConnStr; 
      string _dbMembershipConnStr = HttpContext.Current.Session["_dbMembershipConnStr"].ToString(); 
      //string connectionString = ManageSessionVariable.Current._dbContextConnStr; 

      if (_dbMembershipConnStr != "" && _dbMembershipConnStr != "db_not_validate" && _dbMembershipConnStr != "db_not_exist") 
      { 
       try 
       { 
        // Set private property of Membership provider. 
        //FieldInfo connectionStringField = GetType().BaseType.GetField("_sqlConnectionString", BindingFlags.Instance | BindingFlags.NonPublic); 
        //connectionStringField.SetValue(this, _dbMembershipConnStr); 
        FieldInfo connectionStringField = GetType().BaseType.GetField("_sqlConnectionString", BindingFlags.Instance | BindingFlags.NonPublic); 
        if (connectionStringField != null) 
         connectionStringField.SetValue(this, _dbMembershipConnStr); 

        //Set role provider 
        var roleField = Roles.Provider.GetType().GetField("_sqlConnectionString", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); 
        if (roleField != null) 
         roleField.SetValue(Roles.Provider, _dbMembershipConnStr); 

        //Set Profile Provider 

        var profileField = ProfileManager.Provider.GetType().GetField("_sqlConnectionString", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); 
        if (profileField != null) 
         profileField.SetValue(ProfileManager.Provider, _dbMembershipConnStr); 
       } 
       catch (Exception ex) 
       { 
        throw ex; 
       } 

      } 
     } 
    } 

Когда я работает мое приложение локально, когда я войти в систему с клиентом А [DB1] -User1 является логины успешно. Но когда я выйти из системы и пытается войти в систему с Client B [DB2] Пользователь2 оно проливает это сообщение об ошибке:

Ваша попытка Войти не была успешной

Когда я снова запустить приложение & я наоборот то есть. войдите в систему с клиентом B [DB2] -User2, он успешно зарегистрирован, но когда я пытаюсь использовать клиент A [DB1] -User1 в одном приложении, он вызывает такую ​​же ошибку. Но я могу войти в систему с клиентами B [DB2].

Когда я отлажена с точки останова он выдает ошибку на

ValidateUser (строка, строка Псевдоним Passwd)

метода. Метод ValidateUser возвращает false.

Я пробовал много вариантов, но ничего не работает. Прошу вас, провери меня.

+0

Можете ли вы включить функцию ValidateUser(), так как это функция, вызывающая ошибку? –

+0

Я использую метод класса Membership для проверки: bool Status = Membership.ValidateUser (UserName, Password); , который присутствует в: namespace System.Web.Security public static class Membership { public static bool ValidateUser (string username, string password); } – Tukaram

+0

Можете ли вы проверить, проверен ли пользователь, что он был проверен на предмет изменений между попытками входа в систему или если он все еще застрял на встроенном пользователе. –

ответ

0

Проблема была связана с методом инициализации SqlMembership. Когда пользователь регистрируется в первый раз, он вызывает метод инициализации &. Когда другой пользователь пытается войти в систему, он использует одну и ту же строку соединения. поэтому его не проверяют. Если мы попытаемся вызвать метод инициализации SqlMembershipProvider, он выдает исключение из «InvalidOperationException: поставщик членства уже инициализирован».

Поэтому я создал объект своего пользовательского членства &, когда я вызываю метод проверки членства с помощью вновь созданного объекта. Я могу установить строку подключения.

EPMembershipProvider myProvider = new EPMembershipProvider(); 
string configPath = "~/web.config"; 
Configuration config =  WebConfigurationManager.OpenWebConfiguration(configPath); 
MembershipSection section = (MembershipSection)config.GetSection("system.web/membership"); 
ProviderSettingsCollection settings = section.Providers; 
NameValueCollection membershipParams = settings[section.DefaultProvider].Parameters; 
myProvider.Initialize("EPMembershipProvider", membershipParams); 

bool Status = myProvider.ValidateUser(UserName, Password); 

И он успешно работал. Thanx to Shri n all ... :-)