2016-02-05 31 views
-2

我在我的应用程序使用两个成员资格提供,在用户名和密码的用户密钥,它应该检查在第一成员提供的用户名,如果不是在第一个供应商,那么只有在搜索的用户名第二成员提供者。但问题是,每次搜索第二个成员提供商时,配置文件和角色提供商仍然是第一个提供商。我在代码中做错了什么? 下面是我的代码:不能获得简介和作用其次成员资格提供

protected void Login1_Authenticate(object sender, AuthenticateEventArgs e) 
{ 
    MembershipProvider ProviderName = Membership.Providers["MySqlMembershipProvider2"]; 


    if (Membership.ValidateUser(Login1.UserName, Login1.Password) == true) 
    { 
     e.Authenticated = true; 
     Login1.DestinationPageUrl = "~/Start.aspx"; 
    } 
    else 
    { 
     if (Membership.Providers["MySqlMembershipProvider2"].ValidateUser(Login1.UserName, Login1.Password) == true) 
     { 

      RoleProvider RoleName= Roles.Providers["MySqlRoleProvider2"]; 
      ProviderName.GetUser(Login1.UserName,true); 
      e.Authenticated = true; 
      Login1.DestinationPageUrl = "~/CL/CLLogin.aspx"; 
     } 
     else 
     { 
      e.Authenticated = false; 
     } 
    } 
} 

的web.config:

<roleManager defaultProvider="MySQLRoleProvider" enabled="true"> 
    <providers> 
    <clear/> 
    <add name="MySQLRoleProvider" connectionStringName="MySQLMembershipConnection" applicationName="/" type="MySql.Web.Security.MySQLRoleProvider" autogenerateschema="true"/> 
    <add name="MySQLRoleProvider2" connectionStringName="MySQLMembershipConnection2" applicationName="/" type="MySql.Web.Security.MySQLRoleProvider" autogenerateschema="true"/> 
    </providers> 
</roleManager> 
<anonymousIdentification enabled="true"/> 
<membership defaultProvider="MySQLMembershipProvider"> 
    <providers> 
    <clear/> 
    <add name="MySQLMembershipProvider" type="MySql.Web.Security.MySQLMembershipProvider" connectionStringName="MySQLMembershipConnection" autogenerateschema="true" applicationName="/" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="true" requiresUniqueEmail="false" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"/> 
    <add name="MySQLMembershipProvider2" type="MySql.Web.Security.MySQLMembershipProvider" connectionStringName="MySQLMembershipConnection2" autogenerateschema="true" applicationName="/" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="true" requiresUniqueEmail="false" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"/> 
    </providers> 
</membership> 
<profile defaultProvider="MySQLProfileProvider"> 
    <providers> 
    <clear/> 
    <add name="MySQLProfileProvider" type="MySql.Web.Profile.MySqlProfileProvider" applicationName="/" connectionStringName="MySQLMembershipConnection" autogenerateschema="true"/> 
    <add name="MySQLProfileProvider2" type="MySql.Web.Profile.MySqlProfileProvider" applicationName="/" connectionStringName="MySQLMembershipConnection2" autogenerateschema="true"/> 
    </providers> 
    <properties> 
    <add name="FullName" provider="MySQLProfileProvider"/> 
    <add name="FName" provider="MySQLProfileProvider"/> 
    <add name="ClassName" provider="MySQLProfileProvider2"/> 
    <add name="Area" provider="MySQLProfileProvider2"/> 
    </properties> 
</profile> 
<sessionState> 
    <providers> 
    <add name="MySqlSessionStateStore" type="MySql.Web.SessionState.MySqlSessionStateStore,MySql.Web"/> 
    <add name="MySqlSessionStateStore2" type="MySql.Web.SessionState.MySqlSessionStateStore,MySql.Web"/> 
    </providers> 
</sessionState> 

回答

0

你login_authenticate不正确实施,需要处理同时使用供应商进行身份验证。通过首先检查默认提供程序(如果是),然后对第二个提供程序(在if语句中)进行身份验证。这是一个代码示例。您不需要在验证方法开始时对provider2进行硬编码。

代码示例:

protected void Login1_Authenticate(object sender, AuthenticateEventArgs e) 
    { 
     bool foundUser = false; 
     List<string> roles = new List<string>(); 
     roles.Add("GeneralUser"); 
     // this will call the default MembershipProvider 
     if (Membership.Provider.ValidateUser(LoginBox.UserName, LoginBox.Password)) 
     { 
      foundUser = true; 
      // do any additional lookups for this type of user (Default MembershipProvider) here 
     } // otherwise, explicitly call secondary provider 
     else if (
      Membership.Providers["SecondarySqlMembershipProvider"].ValidateUser(LoginBox.UserName, 
                       LoginBox.Password)) 
     { 
      foundUser = true; 
      roles.Add("SecondaryUser"); 
      // do any additional lookups relevant to this type of user 
     } 
     if (foundUser) 
     { 
      Session["UserId"] = LoginBox.UserName; 
      Session["Groups"] = roles; 
     } 
     e.Authenticated = foundUser; 
    } 

希望这有助于。

+0

我以前见过这个解决方案,但我在第一个和第二个角色提供者中有很多角色。我不知道如何将这个解决方案应用于我的情况。 –

+0

将角色加载为逗号分隔值。所以当你需要它时你就拥有它。 – Mostafa

+0

我试过上面的解决方案,但仍然无法正常工作。除此之外,我还能做什么? –

相关问题