asp.net – 从AD成员资格提供程序运行时切换到SQL成员资格提供程序

在我的asp.net应用程序管理功能中,我正在尝试组合AD身份验证和表单授权来创建用户,角色和将用户分配给角色等.我已在我的web.config中配置MembershipADProvider和AspNetSqlMembershipProvider,并将MembershipADProvider作为默认值.用户使用AD身份验证登录后,我需要切换/分配我的成员资格对象以使用AspNetSqlMembershipProvider,以便从成员对象(来自dbo.aspnet_Users表)中获取所有用户.如何在运行时切换提供程序?在搜索到这个问题后我尝试了不同的方法,到目前为止,这些方法似乎都不适用于我.

以下是我尝试过的几种方法:

1. foreach(MembershipProvider mp in Membership.Providers)

            {

                if(mp.Name ==“MembershipADProvider”)

                {

                    Membership.Providers.Remove(MembershipADProvider“);

                    MembershipUserCollection users = Membership.GetAllUsers();

                    ddlUsers.DataSource = users;

                    ddlUsers.DataBind();

                    打破;

                }

            }

Membership.Providers.Remove(MembershipADProvider“); – 不起作用,因为它不受支持..
此外,尝试清除Membership.Providers,然后仅添加也不支持的AspNetSqlMembershipProvider类型.

>我无法使用值设置Membership.Provider
Membership.Providers [“AspNetSqlMembershipProvider”]作为Membership.Provider是一个只读属性.
>我试图切换2个提供者之间的连接字符串,这些提供者没有打开提供者,因为两者都是不同类型的提供者.如果两者都是sqlserver提供者,我相信它会起作用.

如果有人成功实施,或者如果这是一个看似合理的方法,请告诉我.谢谢!

最佳答案 您可以将一个显式提供程序传递给您的代码,而不是直接依赖于Memebership(它只包含在配置中标记为默认值的那个).没有必要在运行时交换它们,想一想这会如何影响线程安全性.

所以而不是说Membership.GetAllUsers();你会做类似的事情(我没有编译器):

public UserSerivce : IUserService
{
   private MembershipProvider provider;

   public UserService(MembershipProvider provider)
   {
       this.provider = provider;
   }

   public IEnumerable<MembershipUser> GetUsers()
   {
       return provider.GetAllUsers();
   }

   public void DoSomethingElseUseful()
   {
       ...
   }

}

然后将其用于特定提供商:

var service = new UserService(Membership.Providers["mySqlMembershipProvider"]);
var users = service.GetUsers();

或者如果使用AD特定代码:

var service = new UserService(Membership.Providers["myADMembershipProvider"]);
var users = service.GetUsers();

以这种方式使用DI也有助于保持代码可测试性.

点赞