【问题标题】:Cannot Get Profile And Role In Second Membership Provider无法在第二个会员提供者中获取个人资料和角色
【发布时间】:2016-02-05 01:20:07
【问题描述】:

我在我的应用程序中使用了两个会员提供者,当用户输入用户名和密码时,它应该检查第一个会员提供者中的用户名,如果不在第一个提供者中,则只在第二个会员提供者中搜索用户名。但问题是,每次搜索第二个会员提供者时,个人资料和角色提供者仍然是第一个提供者。我的代码做错了什么? 以下是我的代码:

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>

【问题讨论】:

    标签: c# mysql asp.net


    【解决方案1】:

    您的 login_authenticate 未正确实现,您需要处理以使用两个提供程序进行身份验证。通过首先检查默认提供者(if case),然后针对第二个提供者(if else)语句进行身份验证。这是一个代码示例。您不需要在身份验证方法的开头对 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;
        }
    

    希望这会有所帮助。

    【讨论】:

    • 我之前看到过这个解决方案,但是我在第一和第二角色提供者中有很多角色。我不知道如何将此解决方案应用于我的情况。
    • 将角色加载为逗号分隔值。以便您在需要时拥有它。
    • 我试过上面的解决方案,但还是不行。除了这个,我还能做什么?
    猜你喜欢
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多