为asp.net实现此动态登录方案的最简单方法

时间:2009-02-02 18:37:07

标签: c# asp.net-membership membership membership-provider

我目前有一个不同用户可以登录的站点,并且根据他们的子域,会显示来自不同数据库的不同数据。我重写SqlMembershipProvider使用“temp”连接字符串,我根据这篇文章的说明在Initialize Method期间动态设置:

http://forums.asp.net/p/997608/2209437.aspx

public override void Initialize(string name, NameValueCollection config)
    {
        // intercept the setting of the connection string so that we can set it ourselves...
        string specifiedConnectionString = config["connectionStringName"];

        ConnectionStringSettings connectionString = ConfigurationManager.ConnectionStrings[specifiedConnectionString];

        var fi = typeof(ConfigurationElement).GetField("_bReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);

        fi.SetValue(connectionString, false);

        connectionString.ConnectionString = WakeflyClientHelper.GetClientConnectionStringByCurrentSubdomain();

        config["connectionStringName"] = connectionString.Name;

        // Pass doctored config to base classes
        base.Initialize(name, config);
    }

问题是SqlMembershipProvider类似乎是“静态的”,因为当多个用户从不同的子域连接时,他们最终会看到来自其中一个数据库的用户帐户,而不是他们自己的每个数据库。看起来应用程序调用Initialize,而不是基于每个请求。

所以我的问题是......实施解决方案的最简单方法是什么?

我之前没有写过自定义提供程序,所以我不确定它是如何工作的,或者有什么限制。如果我自己写的话,如果我忽视某些东西(更不用说它将花费的时间),总会有安全漏洞的可能性。有什么想法吗?

更新1: 我可以拥有一个数据库,但是,给定子域中的用户需要能够在他们自己的子域中添加/编辑/删除用户,而无需查看其他子域的用户。在这个计划下,这可能吗?

2 个答案:

答案 0 :(得分:2)

提供了SQLMembershipProvider的代码here。您可以通过将项目添加到解决方案并更改web.config中的命名空间引用来扩展/更改您认为必要的内容。

答案 1 :(得分:0)

我已经使用单个成员资格数据库来处理所有登录,然后根据他们登录的域将它们连接到相应的数据库。