none
ConnectionString e Web.config RRS feed

  • Pergunta

  • Boa tarde!

    Necessito alterar aplicações ASP .NET.

    Atualmente temos a string de conexão lá no Web.config com usuário e senha definidos no próprio arquivo, ex: 

    connectionString="Data Source=XXXXDEV\SQLSERVER2008;Initial Catalog=XXXX;User ID=sa;Password=1234567890;

    Acontece que por segurança, definimos que ao invés de utilizar este usuário (sa) gravado no Web.config por padrão, queremos utilizar usuarios cadastrados no SQL Server, ou seja, a aplicação utilizaria as credenciais do indivíduo logado para realizar select/insert/update no banco.

    Até um ponto eu consegui recuperar tal string via C# em minha classe de banco de dados:
    ex: No Web.Config defino genericamente: 

    "...Initial Catalog=XXXX;User ID={ID};Password={Password};"

    e na aplicação/classe BD acesso com Session (capturadas na tela de Login) alterando partes com o replace..

    private string connStringXXXX = ConfigurationManager.ConnectionStrings["XXXXConnectionString"].ConnectionString.Replace("{ID}", HttpContext.Current.Session["ID"].ToString()).Replace("{Password}", HttpContext.Current.Session["Password"].ToString());

    até aí tudo bem, nas consultas de classe..... mas quando há um DataSource embutido no arquivo ".aspx" não há como eu executar tal replace com sessão, aí gera erro de usuário {ID} inválido e etc.....

    há uma forma de eu adicionar esta minha string alterada no C# ao invés do DataSource embutido???
    pois este lê o Web.config original com (sa) e não o usuário logado logicamente..

    <asp:dropdownlist appenddatabounditems="True" autopostback="True" datasourceid="SqlDS_Solicit" datatextfield="DesTipSol" datavaluefield="CodTipSol" font-names="Arial" font-size="8pt" id="ddlSolicit" onselectedindexchanged="ddlSolicit_SelectedIndexChanged" runat="server" width="100px">
                                    <asp:listitem></asp:listitem>
                                </asp:dropdownlist>
                                <asp:sqldatasource connectionstring="<%$ ConnectionStrings:CASUConnectionString %>" id="SqlDS_Solicit" runat="server" selectcommand="SELECT CodTipSol, DesTipSol FROM TipoXxxx ORDER BY DesTipSol">
                                </asp:sqldatasource>

    ou existe outra solução?

    Obrigado,


    Rafael Silva, Analista e Desenvolvedor de Sistemas


    • Editado rafael.dev segunda-feira, 13 de fevereiro de 2012 10:53 PRIV
    sexta-feira, 10 de fevereiro de 2012 20:02

Respostas

  • O que o Paulo quis dizer, só complementando, é que no evento OnLoad da página por exemplo, você poe:

    SqlDS_Solicit.ConnectionString = .... ;
    Eu não testei, mas acredito que funciona também.



    Ao infinito e além!

    • Marcado como Resposta Harley Araujo segunda-feira, 13 de fevereiro de 2012 09:37
    sábado, 11 de fevereiro de 2012 12:20
  • [...]a aplicação utilizaria as credenciais do indivíduo logado para realizar select/insert/update no banco.

    [...]

    Boas Rafael,

    O que dizes precisar já é possivel especificar directamente numa ConnectionString.

    Estou a falar de "Trusted Authentication" que numa ConnectionString se traduz por usar "Integrated Security=SSPI;" e remover o par User ID e Password.

    Assim podes alterar a ConnectionString no web.config para:

    Data Source=CASUDEV\SQLSERVER2008;Initial Catalog=CASU; Integrated Security=SSPI;

    e a ligação à BD será estabelecida usando as credenciais do utilizador logado.

    Para terminar aqui ficam algumas notas adicionais:

    • Nunca usar o utilizador 'sa', nem em ambiente de desenvolvimento
    • Definir as ConnectionStrings no código não tornam uma aplicação mais segura, apenas contribuem para criar aplicações de manutenção dificil e de reaproveitamento dúvidoso.
    • Se a segurança é um factor critico, devemos sempre encriptar a secção connectionString do web.config.

    Nuno Gomes http://nunogomes.net

    • Marcado como Resposta Harley Araujo segunda-feira, 13 de fevereiro de 2012 09:37
    segunda-feira, 13 de fevereiro de 2012 02:50
  • Olá Rafael,

    A minha resposta anterior pode ter-te induzido num erro, mas que resolveste muito bem.

    Passo a explicar, quando se usa SSPI a ligação à BD é feita com as credenciais do utilizador sobre o qual o processo está a correr. No caso de um IIS é naturalmente o utilizador associado à AppPool que a aplicação está a usar.

    No teu caso a AppPool está a correr sobre o utilizador "NT AUTHORITY\NETWORK SERVICE" e logo é com esse que o login na BD é realizado.

    Eu não recomendo adicionar este utilizador como db_owner da tua BD pois pode de facto trazer alguns problemas de segurança (este utilizador pode ser usado por outros programas).

    A minha recomendação é a criação de um utilizador especifico para a tua aplicação que:

    • terá os previlégios minimos necessários para realizar todas as tarefas na BD
    • será membro do grupo IIS_WPG para poder correr o worker process do IIS

    Depois deverás alterar a Identity associada à AppPool da tua aplicação para passar a usar o tal utilizador especifico.

    Et voilá ... estes são normalmente os passos necessários mas podem ser necessárias alterações de IIS para IIS, i.e., a forma de configurar e o nome do grupo podem variar.


    Nuno Gomes http://nunogomes.net

    • Marcado como Resposta rafael.dev terça-feira, 14 de fevereiro de 2012 11:02
    terça-feira, 14 de fevereiro de 2012 01:23

Todas as Respostas

  • Boa tarde!

    Consigo buscar ao invés de "<%$ ConnectionStrings:NorthwindOleDbConnection %>" que está no Web.config, o valor de uma variável string do código ".cs" que contém tal texto de conexão? 

    <form id="form1" runat="server">
    
          <asp:SqlDataSource
              id="SqlDataSource1"
              runat="server"
              DataSourceMode="DataSet"
              ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
              SelectCommand="SELECT EmployeeID,FirstName,LastName,Title FROM Employees"
              UpdateCommand="Update Employees SET FirstName=@FirstName,LastName=@LastName,Title=@Title WHERE EmployeeID=@EmployeeID">
          </asp:SqlDataSource>
    
          <asp:GridView
              id="GridView1"
              runat="server"

    Motivo: Preciso em tempo de execução informar o usuário e senha para string de conexão que fica no Web.Config, de uma forma alternativa consegui campturar tal string do Web.Config e fazer replace para ID/Pass... mas dentro da página asp busca-se também lá na connection string do Web.Config, invalidando minha alternativa :/

    Obrigado,
    Rafael


    Rafael Silva, Analista e Desenvolvedor de Sistemas

    sexta-feira, 10 de fevereiro de 2012 18:05
  • public List<Entidade> Gostei(int id) { List<Entidade> ListaEntidade = new List<Entidade>(); SqlCommand cmd = new SqlCommand();

    //a linha abaixo é sua string

    SqlConnection cn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["MyNorthwind"].ToString()); cmd.Connection = cn; cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "nome proc"; cmd.Parameters.Add("@idArea", SqlDbType.Int).Value = id; cmd.Connection.Open(); SqlDataReader dr = cmd.ExecuteReader(); if (dr.HasRows) { while (dr.Read()) { objDicaGostei.Add(new Entidade() { Gostei = new Entidade() { TotalGostei = (Int64)dr["ColunaTabela"], IdGostei = (int)dr["ColunaTabela"] } }); } } cmd.Connection.Close(); dr.Close(); return ListaEntidade; }

    Espero ter ajudado.
    sexta-feira, 10 de fevereiro de 2012 18:52
  • Acho que não consegui me expressar corretamente, mas valeu pela tentativa Romy.

    expliquei melhor em outro tópico, sessão mais correta, ASP NET:

    http://social.msdn.microsoft.com/Forums/pt-BR/aspnetpt/thread/d6a19818-3ee1-48a3-bc41-0069d9ccd4ad


    Rafael Silva, Analista e Desenvolvedor de Sistemas

    sexta-feira, 10 de fevereiro de 2012 20:04
  • Mesmo usando um "DataSource embutido" você pode tentar alterar pelo código antes dele ser carregado. Nunca fiz, mas acredito que funciona. É por estas e outras que prefiro tudo via código.

    Paulo César Viana
    .NET Developer
    MCC - Microsoft Community Contributor
    MCP - Microsoft Certified Professional
    MCTS - Microsoft Certified Technology Especialist
    --
    Marque as respostas e contribua para uma melhora no fórum.

    sábado, 11 de fevereiro de 2012 01:47
  • O que o Paulo quis dizer, só complementando, é que no evento OnLoad da página por exemplo, você poe:

    SqlDS_Solicit.ConnectionString = .... ;
    Eu não testei, mas acredito que funciona também.



    Ao infinito e além!

    • Marcado como Resposta Harley Araujo segunda-feira, 13 de fevereiro de 2012 09:37
    sábado, 11 de fevereiro de 2012 12:20
  • [...]a aplicação utilizaria as credenciais do indivíduo logado para realizar select/insert/update no banco.

    [...]

    Boas Rafael,

    O que dizes precisar já é possivel especificar directamente numa ConnectionString.

    Estou a falar de "Trusted Authentication" que numa ConnectionString se traduz por usar "Integrated Security=SSPI;" e remover o par User ID e Password.

    Assim podes alterar a ConnectionString no web.config para:

    Data Source=CASUDEV\SQLSERVER2008;Initial Catalog=CASU; Integrated Security=SSPI;

    e a ligação à BD será estabelecida usando as credenciais do utilizador logado.

    Para terminar aqui ficam algumas notas adicionais:

    • Nunca usar o utilizador 'sa', nem em ambiente de desenvolvimento
    • Definir as ConnectionStrings no código não tornam uma aplicação mais segura, apenas contribuem para criar aplicações de manutenção dificil e de reaproveitamento dúvidoso.
    • Se a segurança é um factor critico, devemos sempre encriptar a secção connectionString do web.config.

    Nuno Gomes http://nunogomes.net

    • Marcado como Resposta Harley Araujo segunda-feira, 13 de fevereiro de 2012 09:37
    segunda-feira, 13 de fevereiro de 2012 02:50
  • Obrigado pelas respostas,

    Mas estou com uma última dúvida, seguindo a orientação de Nuno Miguel, tive de ativar a autenticação "Windows" no IIS...
    Ainda assim, a app gera erro de "Cannot open database requested by the login. The login failed. Login failed for user ‘NT AUTHORITY\NETWORK SERVICE’."

    Para corrigir, segui a dica desta URL e logo funcionou:
    http://blog.sqlauthority.com/2009/08/20/sql-server-fix-error-cannot-open-database-requested-by-the-login-the-login-failed-login-failed-for-user-nt-authoritynetwork-service/

    É seguro/padrão habilitar tal conta "NT AUTHORITY\NETWORK SERVICE" para a base desejada com "db_owner"?
    Em fim, tenho certeza que minha app estará utilizando as credenciais de domínio do Windows para executar a aplicação?


    Rafael Silva, Analista e Desenvolvedor de Sistemas

    segunda-feira, 13 de fevereiro de 2012 14:01
  • Olá Rafael,

    A minha resposta anterior pode ter-te induzido num erro, mas que resolveste muito bem.

    Passo a explicar, quando se usa SSPI a ligação à BD é feita com as credenciais do utilizador sobre o qual o processo está a correr. No caso de um IIS é naturalmente o utilizador associado à AppPool que a aplicação está a usar.

    No teu caso a AppPool está a correr sobre o utilizador "NT AUTHORITY\NETWORK SERVICE" e logo é com esse que o login na BD é realizado.

    Eu não recomendo adicionar este utilizador como db_owner da tua BD pois pode de facto trazer alguns problemas de segurança (este utilizador pode ser usado por outros programas).

    A minha recomendação é a criação de um utilizador especifico para a tua aplicação que:

    • terá os previlégios minimos necessários para realizar todas as tarefas na BD
    • será membro do grupo IIS_WPG para poder correr o worker process do IIS

    Depois deverás alterar a Identity associada à AppPool da tua aplicação para passar a usar o tal utilizador especifico.

    Et voilá ... estes são normalmente os passos necessários mas podem ser necessárias alterações de IIS para IIS, i.e., a forma de configurar e o nome do grupo podem variar.


    Nuno Gomes http://nunogomes.net

    • Marcado como Resposta rafael.dev terça-feira, 14 de fevereiro de 2012 11:02
    terça-feira, 14 de fevereiro de 2012 01:23
  • Bom dia!

    Nuno, entendi sua resposta, mas gostaria de saber se é possível que as tarefas do BD sejam realizadas pela própria credencial do usuário que está cadastrado no BD com sua permissões (DOMAIN/USER), são vários grupos, várias configurações de permissões, logo se eu deixar rodar a aplicação neste "utilizador específico" tais regras nas tabelas/grupos serão inutilizadas...

    Obrigado,


    Rafael Silva, Analista e Desenvolvedor de Sistemas

    terça-feira, 14 de fevereiro de 2012 11:02