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

时间:2011-08-26 21:05:06

标签: asp.net membership provider

在我的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类型。

  1. 我无法使用值设置Membership.Provider Membership.Providers [“AspNetSqlMembershipProvider”]作为Membership.Provider是一个只读属性。

  2. 我试图切换2个提供者之间的连接字符串,这些连接字符串没有提供提供者,因为两者都是不同类型的提供者。如果这两个提供者都是sqlserver提供者,我认为这样做了。

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

2 个答案:

答案 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