1

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

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:我可以有一个数据库,但是,给定子域中的用户需要能够在自己的子域中添加/编辑/删除用户,而不会看到其他子域的用户。在这个计划下这可能吗?

4

2 回答 2

2

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

于 2009-02-02T19:00:12.447 回答
0

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

于 2009-02-02T18:40:53.610 回答