简体   繁体   English

按代码更改ASP.NET成员资格提供程序

[英]Change ASP.NET Membership Provider by code

We are in need of supporting two Membership providers simultaneously in an ASP.NET WebFroms application. 我们需要在ASP.NET WebFroms应用程序中同时支持两个成员资格提供程序。 Indeed user by checking a Checkbox indicates that he/she wants to login via Asp Net Sql Membership Provider or Asp Net Active Directory Membership Provider 事实上,用户通过检查复选框表明他/她想通过Asp Net Sql Membership ProviderAsp Net Active Directory Membership Provider登录

My idea is changing Membership provider programmatically based on Checkbox checked value. 我的想法是根据Checkbox选中的值以编程方式更改成员资格提供程序。 But do not know how can do this. 但不知道怎么能这样做。

Any help is highly appreciated. 任何帮助都非常感谢。

What you need is a composite provider that wraps the two real providers and a service that can determine which provider should be used. 您需要的是一个复合提供程序,它包装两个真正的提供程序和一个可以确定应该使用哪个提供程序的服务。

UPDATE UPDATE

Your CompositeProvider might look like this and can be registered in your web.config just like any other provider. 您的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.
}

This is essentially the same answer as Steven's , but with a fully implemented class (to save someone else the time of writing this all out). 这与Steven的答案基本相同,但是有一个完全实现的类(为了节省其他人写这个全部的时间)。

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);
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM