【问题标题】:Change ASP.NET Membership Provider by code通过代码更改 ASP.NET Membership Provider
【发布时间】:2013-09-13 22:33:17
【问题描述】:

我们需要在一个 ASP.NET WebFroms 应用程序中同时支持两个成员资格提供程序。 Indeed 用户通过勾选复选框表示他/她想通过Asp Net Sql Membership ProviderAsp Net Active Directory Membership Provider 登录

我的想法是根据 Checkbox 选中值以编程方式更改成员资格提供程序。但不知道如何才能做到这一点。

非常感谢任何帮助。

【问题讨论】:

  • 也许你可以使用这个:msdn.microsoft.com/en-us/library/…(记得在 web.config 文件中列出所有提供者)使用返回的MembershipProvider,你可以使用这些方法:msdn.microsoft.com/en-us/library/…
  • @TimSchmelter:我之前已经审查过它们。到目前为止,我正在研究 Steven 的解决方案。顺便说一句,感谢您的帮助。

标签: asp.net asp.net-membership


【解决方案1】:

您需要的是一个组合的提供者,它包装了两个真实的提供者和一个可以确定应该使用哪个提供者的服务。

更新

您的 CompositeProvider 可能看起来像这样,并且可以像任何其他提供商一样在您的 web.config 中注册。

public class CompositeProvider : MembershipProvider
{
    private MembershipProvider SqlProvider
    {
        get { return Membership.Providers["Sql Provider"]; }
    }

    private MembershipProvider AdProvider
    {
        get { return Membership.Providers["Ad Provider"]; }
    }

    // This property implements the logic that knows how
    // to switch between the two providers.
    private MembershipProvider Provider
    {
        get
        {
            var context = HttpContext.Current;

            if (context != null)
            {
                var session = context.Session;

                if (session != null &&
                    session["use_ad_provider"] == "true")
                {
                    return AdProvider;
                }
            }

            return SqlProvider;
        }
    }

    public override bool ChangePassword(string username, 
        string oldPassword, string newPassword)
    {
        return Provider.ChangePassword(username, oldPassword, newPassword);
    }

    public override bool DeleteUser(string username, 
        bool deleteAllRelatedData)
    {
        return Provider.DeleteUser(username, deleteAllRelatedData);
    }

    public override bool EnablePasswordReset
    {
        get { return Provider.EnablePasswordReset; }
    }

    public override bool EnablePasswordRetrieval
    {
        get { return Provider.EnablePasswordRetrieval; }
    }

    // TODO: Implementation of all other members.
}

【讨论】:

  • 我尝试过但没有成功。事实上,我不想参与 ActiveDirectory 成员的低级细节。我试试这个:stackoverflow.com/questions/3232072/…
  • 你的更新很有希望。我正在测试它。由于我们的代码中存在问题,需要一些时间来判断它是否是答案。提前致谢。
  • 感谢您的解决方案。它终于奏效了。我们自己的基本代码中的一个问题是错误地使用了Login.Authenticate eventstackoverflow.com/questions/821395/…
【解决方案2】:

这与Steven's 的答案基本相同,但具有完全实现的类(以节省其他人写这一切的时间)。

public class CompositeProvider : MembershipProvider
{

    public override string ApplicationName
    {
        get
        {
            return _provider.ApplicationName;
        }
        set
        {
            _provider.ApplicationName = value;
        }
    }

    private MembershipProvider _provider
    {
        get
        {
            // Insert your logic here to change between multiple providers
            if(SomeCondition == true)
                return Membership.Providers["AspNetSqlMembershipProvider"];
            else
                return Membership.Providers["AspNetSqlMembershipProvider2"];
        }
    }

    public override bool ChangePassword(string username, string oldPassword, string newPassword)
    {
        return _provider.ChangePassword(username, oldPassword, newPassword);
    }

    public override bool ChangePasswordQuestionAndAnswer(string username, string password, string newPasswordQuestion, string newPasswordAnswer)
    {
        return _provider.ChangePasswordQuestionAndAnswer(username, password, newPasswordQuestion, newPasswordAnswer);
    }

    public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status)
    {
        return _provider.CreateUser(username, password, email, passwordQuestion, passwordAnswer, isApproved, providerUserKey, out status);
    }

    public override bool DeleteUser(string username, bool deleteAllRelatedData)
    {
        return _provider.DeleteUser(username, deleteAllRelatedData);
    }

    public override bool EnablePasswordReset
    {
        get { return _provider.EnablePasswordReset; }
    }

    public override bool EnablePasswordRetrieval
    {
        get { return _provider.EnablePasswordRetrieval; }
    }

    public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords)
    {
        return _provider.FindUsersByEmail(emailToMatch, pageIndex, pageSize, out totalRecords);
    }

    public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords)
    {
        return _provider.FindUsersByName(usernameToMatch, pageIndex, pageSize, out totalRecords);
    }

    public override MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords)
    {
        return _provider.GetAllUsers(pageIndex, pageSize, out totalRecords);
    }

    public override int GetNumberOfUsersOnline()
    {
        return _provider.GetNumberOfUsersOnline();
    }

    public override string GetPassword(string username, string answer)
    {
        return _provider.GetPassword(username, answer);
    }

    public override MembershipUser GetUser(string username, bool userIsOnline)
    {
        return _provider.GetUser(username, userIsOnline);
    }

    public override MembershipUser GetUser(object providerUserKey, bool userIsOnline)
    {
        return _provider.GetUser(providerUserKey, userIsOnline);
    }

    public override string GetUserNameByEmail(string email)
    {
        return _provider.GetUserNameByEmail(email);
    }

    public override int MaxInvalidPasswordAttempts
    {
        get { return _provider.MaxInvalidPasswordAttempts; }
    }

    public override int MinRequiredNonAlphanumericCharacters
    {
        get { return _provider.MinRequiredNonAlphanumericCharacters; }
    }

    public override int MinRequiredPasswordLength
    {
        get { return _provider.MinRequiredPasswordLength; }
    }

    public override int PasswordAttemptWindow
    {
        get { return _provider.PasswordAttemptWindow; }
    }

    public override MembershipPasswordFormat PasswordFormat
    {
        get { return _provider.PasswordFormat; }
    }

    public override string PasswordStrengthRegularExpression
    {
        get { return _provider.PasswordStrengthRegularExpression; }
    }

    public override bool RequiresQuestionAndAnswer
    {
        get { return _provider.RequiresQuestionAndAnswer; }
    }

    public override bool RequiresUniqueEmail
    {
        get { return _provider.RequiresUniqueEmail; }
    }

    public override string ResetPassword(string username, string answer)
    {
        return _provider.ResetPassword(username, answer);
    }

    public override bool UnlockUser(string userName)
    {
        return _provider.UnlockUser(userName);
    }

    public override void UpdateUser(MembershipUser user)
    {
        _provider.UpdateUser(user);
    }

    public override bool ValidateUser(string username, string password)
    {
        return _provider.ValidateUser(username, password);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    • 2011-11-27
    • 1970-01-01
    • 2013-04-18
    相关资源
    最近更新 更多