ASP.NET MVC3 IIS6 permite que os usuários de domínio acessem o site, mas outro usuário se conecta ao banco de dados

StackOverflow https://stackoverflow.com/questions/4609477

Pergunta

MVC 3 (provavelmente o mesmo para 1 e 2), servidor 2003, IIS 6, .NET 4, SQL Server 2005

Eu tenho um aplicativo de administração simples que apenas 2 ou 3 pessoas vão fazer login, então não quero me preocupar com a autenticação de formulários, separar o nome de usuário/PW e tudo isso. Quero simplesmente fazer o usuário fazer login com o usuário do anúncio/PW existente. Mas quero conectar -me ao SQL Server por meio de uma conta dedicada que já possui permissões apropriadas para o banco de dados selecionado.

Eu fiz isso no ASP clássico com o seguinte cenário

IIS: Enable anonymous Access: checked.  Username/pw dedicated account for the SQL Server DB
Integrated Windows authentication: unchecked
Digest authentication: unchecked
Basic authentication: unchecked
.NET Passport authentication: unchecked

O aplicativo ASP clássico aceita um formulário HTML postado e depois autentica via LDAP

' Establish connection
Set objConnection = Server.CreateObject("ADODB.Connection")

' Connection properties
objConnection.Provider = "ADsDSOOBJECT"
objConnection.Properties("User ID") = strUsername
objConnection.Properties("Password") = strPassword
objConnection.Properties("Encrypt Password") = True

' Open connection
objConnection.open "DS Query", strUsername, strPassword  ' user supplied user/pw

' Query Active Directory
strQuery = "SELECT cn FROM 'LDAP://" & strDomain & "' WHERE objectClass='*' "

Set objCommand = server.CreateObject("ADODB.Command")
Set objCommand.ActiveConnection = objConnection
objCommand.CommandText = strQuery

' Get recordset
Set objRS = objCommand.Execute

' If no record of user found
If objRS.BOF Or objRS.EOF Then

    ' User does not exist
    AuthenticateUser = False

Else

    ' User is authentic
    AuthenticateUser = True

End If

Eu quero esse mesmo comportamento no .NET, mas sem o formulário HTML. Parece possível que, quando o usuário visitar um controlador com um atributo [Authorize]:

[Authorize(Users = @"domain\user1, domain\user2, domain\user3")]

que eles devem ser solicitados a inserir o usuário do anúncio/PW (ou não com o IE, dependendo da zona e das opções de login automático), seja autenticado, mas use o usuário dedicado no IIS para se conectar ao banco de dados. Como faço isso?

Eu sempre assumi que a representação era o caminho a percorrer, então isso está na minha web.config:

  <system.web>
    <identity impersonate="true"/>
    <authentication mode="Windows" />

Eu tentei adicionar isso, mas não ajuda:

  <anonymousIdentification enabled="false"/>
  <authorization>
      <allow users="*"/>
      <deny users="?"/>
  </authorization>

Eu posso fazer com que tudo funcione para mim se usar autenticação básica, mas isso é apenas porque minha conta também tem acesso ao banco de dados. Se outro usuário que está nessa lista de usuários =, mas não tem acesso ao banco de dados, eles recebem:

Cannot open database "Dbname" requested by the login. The login

fracassado. O login falhou para o usuário 'domain user3'.

Obviamente, a representação não está fazendo isso aqui.

Portanto, esse deve ser um exemplo bastante típico de como autenticar por trás do firewall na sua rede média do Windows. Qual é a melhor abordagem? Eu considerei um Autorizeattribute personalizado usando código semelhante a Autenticação LDAP no ASP.NET MVC Isso parece mais próximo de como as coisas funcionavam no aplicativo ASP clássico, mas, por algum motivo, pensei que poderia fazer com que tudo funcionasse apenas com configurações e configuração.

Edit1:

Depois de ler algumas das segurança do BARRY DORRANS ASP.NET na noite passada, parece que posso alterar o usuário do pool de aplicativos e ter esse usuário que atinge o db do SQL Server. Isso está certo? Ou são os usuários do Anon nas configurações do site que atingem o banco de dados?

Tentei alterar o usuário do pool de aplicativos, mas a conta não faz parte do grupo IIS_WPG. Isso é necessário, certo?

Edit2:Com o BASIC AUTH verificado, Anon verificado com usuário especificado, recebo o seguinte:

User.Identity.Name: DOMAIN\jcurran
User.Identity.IsAuthenticated: True
User.Identity.AuthenticationType: Basic


WindowsIdentity.GetCurrent().AuthenticationType: Kerberos
WindowsIdentity.GetCurrent().Name: DOMAIN\jcurran
WindowsIdentity.GetCurrent().IsAuthenticated: True
WindowsIdentity.GetCurrent().IsAnonymous: False
WindowsIdentity.GetCurrent().IsGuest: False
WindowsIdentity.GetCurrent().IsSystem: False
WindowsIdentity.GetCurrent().ImpersonationLevel.ToString(): Impersonation


Thread.CurrentPrincipal.Identity.Name: DOMAIN\jcurran 

Com a autocompanhada BASIC AUTH, Anon verificado com o usuário especificado, recebo uma página em branco. Inspecionar com rendimentos de violinistas:

HTTP/1.1 401 Unauthorized
Date: Thu, 06 Jan 2011 18:02:42 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 4.0.30319
X-AspNetMvc-Version: 3.0
Cache-Control: private
Content-Length: 0
Foi útil?

Solução

Supondo que você queira acessar o SQL Server com o Windows Auth, então Mudando a identidade do pool de aplicativos é o caminho a percorrer.

Em web.config, você precisará definir impersonate="false" ou o ASP.NET tentará usar as credenciais do cliente para se conectar ao banco de dados em vez do pool de aplicativos (ou seja, parece que a representação está fazendo exatamente o que você pediu para fazer).

No IIS, você deve ativar o Windows Auth integrado e pode desativar o acesso anônimo, se quiser.

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