none
User Instance = True RRS feed

  • Pergunta

  •  

    Caros Srs.

     

    Estive vivenciando um erro em minha aplicação asp.net, e tenho quase certeza de ter achado o motivo do problema, apesar de não ter solucionado por completo o ocorrido.

     

    Descrição do cenário:

     

    Uma aplicação web ASP.NET 2.0 desenvolvida com o Visual Studio 2005 Professional e que utiliza do serviço de membership embutida já no ASP.NET 2.0.

    Esta aplicação está sendo executada no sevidor IIS 5.0 local.

     

     

    Ilustrando o Erro:

     

    Server Error in '/BalloonShop' Application.


    Não é possível abrir o banco de dados padrão do usuário. Falha de logon.
    Falha de logon do usuário 'PETRUSMOV2\ASPNET'.

    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

    Exception Details: System.Data.SqlClient.SqlException: Não é possível abrir o banco de dados padrão do usuário. Falha de logon.
    Falha de logon do usuário 'PETRUSMOV2\ASPNET'.

     

     

     

     Este erro sempre ocorrera quando eu tentava fazer o login na minha aplicação, ou seja, quando a minha aplicação estava tentando acessar o banco de dados aspnetdb.mdf

     

     

    Vamos agora analisar a minha connection string:

     

     

    connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|ASPNETDB.mdf;User Instance=true"

     

     

    Repare que eu estou usando a instrução: User Instance=true

               

     

    O que acontece é que para que uma aplicação qualquer possa usufruir de um banco de dados  em um servidor sql, ela teria que primeiramente se autenticar no servidor e em seguida, ter a autorização de acessar o banco de dados da qual ela (aplicação) necessita. Isso, de certa forma, impossibilita, principalmente os desenvolvedores de aplicações ASP.NET de simplesmente criar um arquivo de banco de dados local e ao publicar a aplicação apenas mover este arquivo para o servidor de produção.

     

    Com a instrução  User Instance=true ao se usar a connection string para acessar o banco de dados, o SQL Server Express cria uma nova e privada instancia de seu servidor, apenas para o acesso do banco de dados contido na connection string. Este acesso a essa nova “instancia virtual” do servidor é dada com os privilégios de sysadmin, porém com várias limitações do tipo: apenas um usuário por vez pode acessar essa instância e outras descritas na referência logo abaixo.

     

    A questão é que para uma nova instância do servidor funcionar, mesmo que ela seja em run-time, é necessário que ela possua os bancos de dados Master e MSDB, e esses são atachados, obviamente em run-time, concomitantemente com a criação da nova instância, porém a origem de seus arquivos: [master.mdf] e [msdb.mdf] são diferentes dos arquivos atachados na instância principal do sql server express.

     

    Ou seja, de nada adianta dar permissões para usuários nos bancos de dados Máster e MSDB, na instancia principal. Pois os arquivos usados serão diferentes dos arquivos da instancia principal.

     

     

    Referência:

    http://msdn2.microsoft.com/en-us/library/ms254504.aspx

     

     

     

    A minha pergunta é:

     

    Como posso dar permissão de autenticação e depois de acesso a um usuário do tipo ‘petrusmov2\aspnet’, que é um usuário do windows a um banco de dados que será atachado em run-time em uma instância do servidor que também será criada em run-time?

     

    Que eu tenha entendido, o problema ocorrido é simplesmente este, ou seja, o login ‘petrusmov2\aspnet’ não tem acesso ao banco de dados Master na instância criada em tempo de execução.

    sexta-feira, 29 de fevereiro de 2008 16:47

Todas as Respostas

  • e so incluir o usuario do seu iis no seu sql express logins e depois dar acesso a base de dados da sua aplicacao.

     

    Abs;

     

    sexta-feira, 29 de fevereiro de 2008 16:55
  • Ok Marcelo, o meu usuário do IIS é o petrusmov2\aspnet

     

    Use Master

    go

     

    sp_helpuser 'PETRUSMOV2\aspnet'

     

    returns:

    PETRUSMOV2\ASPNET public PETRUSMOV2\ASPNET master dbo 6

     

    Mas com o uso da instrução User Instance = True, tanto a instância do sql server quanto o banco de dados master atachado são diferentes, pois são criados em tempo de execução.

     

    Será que não é esse o problema, ou seja, o banco de dados Master, criado em tempo de execução não dá a permissão de acesso ao usuário 'petrusmov2\aspnet'?

     

    sexta-feira, 29 de fevereiro de 2008 17:04
  • Marcelo;

     

    Só para eu me certificar, como eu pego o usuário do IIS?

     

    por um acaso é clicando com o botão direito no nome da pasta virtual onde meu site está hospedado

    depois eu clico com o botão direito, vou em propriedades

    aba segurança de pasta

    controle de acesso anonimo e autenticação...

    botão editar...

     

     

    só gostaria de confirmar se eu estou pegando o usuário no lugar correto.

    sexta-feira, 29 de fevereiro de 2008 17:23