在我的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也有助于保持代码可测试性.