簡體   English   中英

我面臨“您的登錄嘗試未成功”的問題,請重試。 實現自定義成員身份時出錯

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM