Я сталкиваюсь с "Ваша попытка входа не удалась" Пожалуйста, попробуйте еще раз. ошибка при реализации пользовательского членства
Мое требование к приложению - одно приложение и несколько баз данных для каждого клиента. Поэтому я реализовал пользовательское членство для достижения этой цели. Сначала я проверяю, к какому клиенту принадлежит пользователь, в соответствии со строкой соединения из базы данных этого клиента, я динамически устанавливаю строку соединения и проверяю пользователя.
Вот мой веб-конфиг:
<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;
}
}
}
}
Когда я запускаю свое приложение локально, когда я вхожу в систему с Клиентом A[DB1]-User1 успешно входит в систему. Но когда я выхожу из системы и пытаюсь войти в систему с Клиентом B [DB2] User2, выдается следующее сообщение об ошибке:
Ваша попытка входа не удалась
Когда я снова запускаю приложение, я делаю наоборот, т.е. войти в систему с клиентом B[DB2]-User2, он успешно войдет в систему, но при попытке запустить клиент A[DB1]-User1 в том же приложении, он выдаст ту же ошибку. Но я могу войти с помощью Клиента B [DB2].
Когда я отлаживал с точками останова, он выдает ошибку в
ValidateUser (строка Имя пользователя, строка Passwd)
метод. Метод ValidateUser, возвращающий false.
Я перепробовал много вариантов, но ничего не работает. Пожалуйста, проведите меня до конца.
1 ответ
Проблема была в методе инициализации SqlMembership. Когда пользователь входит в первый раз, он вызывает метод initialize и устанавливает строку подключения. Когда другой пользователь пытается войти в систему, он использует ту же строку подключения. вот почему это не проверка. Если мы попытаемся вызвать метод Initialize 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);
И это сработало успешно. Спасибо всем Шри...:-)