maneira mais fácil de implementar este esquema de login dinâmico para asp.net
-
21-08-2019 - |
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?
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.