Членство в ASP.NET для одного сайта, но несколько и потенциально неизвестный экземпляр сервера SQL - PullRequest
0 голосов
/ 03 января 2012

Это моя проблема.У меня есть 1 и только 1 веб-сайт для нескольких клиентов.Чтобы получить доступ к своим данным, клиенты используют такие URL-адреса: http://customer1.mysite.com http://customer2.mysite.com и т. Д.

Каждый клиент имеет экземпляр SqlServer со своими данными.

Зависит от URL-адреса веб-сайтаподключиться к нужному экземпляру сервера sql.Это хорошо.

Моя проблема касается членства, у каждого экземпляра есть своя «база данных членства».В моем 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 голосов
/ 04 января 2012

Я думаю, что у меня есть решение, но оно немного странное.

В моем классе customMemberShipProvider у меня должен быть пустой конструктор, даже если я его никогда не вызываю. И мне нужен другой конструктор (с аргументами, даже если я его никогда не использую).

Так вот мой код:

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);
    }

Привет

0 голосов
/ 03 января 2012

Это интересная проблема.Похоже, вы пытаетесь использовать другую строку подключения для базы данных, основанную на URL.Это может быть немного менее элегантно, но как насчет получения кода для поставщика членства sql и изменения его так, чтобы используемая им строка соединения основывалась на URL-адресе пользователя.Я думаю, что это может быть хорошим решением, если вы действительно используете только одно приложение asp.net.

...