在我的asp.net应用程序管理功能中,我正在尝试将AD身份验证和表单授权结合起来创建用户,角色和将用户分配给角色等。我已在我的web.config中使用MembershipADProvider配置MembershipADProvider和AspNetSqlMembershipProvider作为默认一个。用户使用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提供者,我认为这样做了。
如果有人成功实施,或者如果这是一种看似合理的方法,请告诉我。谢谢!
答案 0 :(得分:2)
您可以将显式提供程序传递给您的代码,而不是直接依赖于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也有助于保持代码可测试。
答案 1 :(得分:0)
如果您需要aspnet_Users表中的所有用户列表,只需使用System.Data.SqlClient
个对象连接到您的数据库并查询该表。您没有理由(您提到过)需要使用会员提供商来获取该数据。
话虽如此,您的会员/身份验证方案听起来可能有一些设计问题,也许最好在另一个问题上解决,但我认为如果您对要完成的整体内容发表评论,它可能会对您有所帮助与多个会员提供商。
编辑:我在使用多个会员提供商时发现了一些可能有用的帖子。看起来一般的想法是实现自定义代码处理Login.Authenticate
控件上的Login
事件,并使用Membership.Providers["ProviderName"].ValidateUser
尝试与每个提供程序进行身份验证。
http://www.stevideter.com/2008/03/20/using-two-membership-providers-for-aspnet-logins/ http://forums.asp.net/p/1112089/1714276.aspx