[英]I am facing “Your login attempt was not successful” Please try again. error while implementing custom membership
我對應用程序的要求是每個客戶端使用單個應用程序和多個數據庫。 因此,我實現了自定義成員身份以實現這一目標。 首先,我根據該客戶端數據庫的連接字符串檢查用戶屬於哪個客戶端,然后動態設置連接字符串並驗證用戶。
這是我的網絡配置:
<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。
我嘗試了很多選擇,但是沒有用。 請引導我。
問題出在SqlMembership的Initialize方法上。 用戶首次登錄時,它將調用初始化方法並設置連接字符串。 當另一個用戶嘗試登錄時,它使用相同的連接字符串。 這就是為什么它無法驗證。 如果嘗試調用SqlMembershipProvider的Initialize方法,則會引發異常“ 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);
它成功地工作了。 感謝Shri n all ... :-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.