一个网站的ASP.NET成员资格,但多个可能未知的sql server实例

时间:2012-01-03 14:06:04

标签: asp.net-membership

这是我的问题。我有1个且只有1个网站供多个客户使用。要访问他们的数据,客户使用这样的网址: http://customer1.mysite.com http://customer2.mysite.com 等

每个客户都有一个带有数据的SqlServer实例。

取决于网站连接到正确的sql server实例的URL。这很好。

我的问题是关于会员资格,每个实例都有自己的“会员数据库”。在我的webconfig中,我配置了一个这样的虚拟部分:

<membership defaultProvider="MyMembershipProvider">
<providers>
<clear />
<add name="MyMembershipProvider"
type="MapApp.MyMembershipProvider, MyApp"            
enablePasswordRetrieval="true" 
enablePasswordReset="true" 
requiresQuestionAndAnswer="false"
applicationName="/" 
requiresUniqueEmail="false" 
passwordFormat="Encrypted" 
minRequiredPasswordLength="5" 
minRequiredNonalphanumericCharacters="0" 
passwordAttemptWindow="10" 
passwordStrengthRegularExpression="" 
connectionStringName="A_DATABASE" />
</providers>           
</membership>

我也有一个自定义的Membershipprovider,其代码如下:

public class MyMembershipProvider : SqlMembershipProvider   
{   
public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)   
{   
    base.Initialize(name, config);   
    // Update the private connection string field in the base class.   
    string connectionString = "my new connection string depdend of the customer"  
    // Set private property of Membership provider.   
    FieldInfo connectionStringField = GetType().BaseType.GetField("_sqlConnectionString", BindingFlags.Instance | BindingFlags.NonPublic);   
                     connectionStringField.SetValue(this, connectionString);   
}   
}  

但是当我打电话给我的自定义会员提供商时,还有一些问题就像“已经实现”一样。

有人可以帮帮我吗?请...

对不起我在这篇长篇文章中的糟糕英语

2 个答案:

答案 0 :(得分:0)

这是一个有趣的问题。您似乎正在尝试根据URL为数据库使用不同的连接字符串。这可能不太优雅,但如何获取sql成员资格提供程序的代码并修改它,以便它使用的连接字符串基于用户URL。如果您真的只使用一个asp.net应用程序,我认为这可能是一个很好的解决方法。

答案 1 :(得分:0)

我想我有解决方案,但有点奇怪。

在我的customMemberShipProvider类中,即使我从不调用它,我也必须有一个空的构造函数。而且我需要另一个构造函数(即使我从未使用它也会使用args)。

所以这是我的代码:

public class myMembershipProvider : SqlMembershipProvider
{
    public myMembershipProvider()
    {
        //never use
    }

    public myMembershipProvider(string dummyArg)
    {
        string configPath = "~/web.config";
        Configuration config = WebConfigurationManager.OpenWebConfiguration(configPath);
        MembershipSection section = (MembershipSection)config.GetSection("system.web/membership");
        ProviderSettingsCollection settings = section.Providers;
        NameValueCollection membershipParams = settings[section.DefaultProvider].Parameters;
        if ((HttpContext.Current.Session != null) && (HttpContext.Current.Session["SubDomainInstanceName"] != null) && (!string.IsNullOrEmpty(HttpContext.Current.Session["SubDomainInstanceName"].ToString())))
        {
            membershipParams.Add("Instance", HttpContext.Current.Session["SubDomainInstanceName"].ToString());
        }
        else
        {
            membershipParams.Add("Instance", "default");
        }
        Initialize(section.DefaultProvider, membershipParams);
    }


    public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
    {
        //need to remove the key before call Initialize method 
        string instance = config["Instance"];
        config.Remove("Instance");
        base.Initialize(name, config);

        // Update the private connection string field in the base class.   
        string connectionString = //my specific connectionstring;
        // Set private property of Membership provider.   
        FieldInfo connectionStringField = GetType().BaseType.GetField("_sqlConnectionString", BindingFlags.Instance | BindingFlags.NonPublic);
        connectionStringField.SetValue(this, connectionString);
    }

此致