Pergunta

Actualmente tenho um site onde diferentes usuários podem acessar, e dependendo da sua sub-domínio, são apresentados com diferentes dados de bancos de dados diferentes. Estou substituindo o SqlMembershipProvider para usar um "temp" string de conexão, que eu definir dinamicamente durante o método de inicialização, conforme as instruções deste post:

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

O problema é que a classe SqlMembershipProvider parece "estático" em que, quando vários usuários se conectar a partir de diferentes sub-domínios, eles acabam vendo as contas de usuário de um dos bancos de dados, e não cada um dos seus próprios. Parece que a inicialização é chamado pelo aplicativo, e não em uma base por solicitação.

Então, minha pergunta para você é ... Qual seria a maneira mais fácil de implementar uma solução para isso?

Eu não escrevi um provedor personalizado antes, então eu não sei como isso funciona, ou quais são as limitações. E se eu escrever isso sozinho, há sempre a possibilidade de falhas de segurança se eu esquecer alguma coisa (para não mencionar o tempo que vai demorar). Alguma idéia?

Update 1: Eu poderia ter um único banco de dados, no entanto, o usuário é dentro de uma dada necessidade sub-domínio a habilidade de adicionar / editar / user exclusão de dentro de sua própria sub-domínio, sem ver outros usuários do sub-domínios. Isso seria possível ao abrigo deste regime?

Foi útil?

Solução

O código para o SqlMembershipProvider é fornecido aqui . Você poderia estender / mudança o que você acha que é necessário, adicionando o projeto para sua solução e alterar as referências a namespace em web.config.

Outras dicas

Eu fiz exatamente isso usando um único banco de dados de membros para lidar com todos os logins, e depois ligá-los ao banco de dados apropriado, dependendo do domínio em que logado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top