我面对的是“;您的登录尝试未成功“;请再试一次.实现自定义成员身份时出错

本文关键字:实现 一次 身份 出错 成员 自定义 面对 登录 未成功 | 更新日期: 2023-09-27 17:59:42

我对应用程序的要求是单个应用程序&每个客户端有多个数据库。所以我实现了自定义成员身份来实现这一点。首先我根据客户端数据库的连接字符串来检查用户属于哪个客户端,然后动态设置连接字符串&验证用户。

这是我的网络配置:

<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>

自定义会员类别:

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成功登录。但是,当我注销并尝试使用ClientB[DB2]User2登录时,它会抛出以下错误消息:

您的登录尝试未成功

当我再次运行应用程序&反之亦然,即使用客户端B[D2]-User2登录,它成功登录,但当我在同一应用程序运行中尝试使用客户端A[DB1]-User1时,它会抛出相同的错误。但是我可以使用ClientB[DB2]用户登录。

当我用断点进行调试时,它会在上抛出错误

ValidateUser(字符串用户名,字符串密码)

方法。ValidateUser方法返回false。

我尝试了很多选择,但都不起作用。请引导我通过。

我面对的是“;您的登录尝试未成功“;请再试一次.实现自定义成员身份时出错

问题出在SqlMembership的Initialize方法上。当用户第一次登录时,它调用initialize方法&设置连接字符串。当另一个用户尝试登录时,它使用相同的连接字符串。这就是为什么它没有得到验证。如果我们尝试调用SqlMembershipProvider的Initialize方法,它会抛出一个异常"InvalidOperationException:成员资格提供程序已初始化"

所以我创建了我的自定义会员对象&当我使用新创建的对象调用Membership validate方法时,我可以设置我的连接字符串。

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…:-)