ASP.NET MVC3 IIS6 Permitir que los usuarios del dominio de acceso al sitio, pero otro usuario que se conecta a la base de datos

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

Pregunta

MVC 3 (probablemente el mismo para 1 y 2), Server 2003, IIS 6, 4 .NET, SQL Server 2005

Tengo una aplicación de administración simple que sólo 2 o 3 personas alguna vez iniciar sesión en, por lo que no quiero molestar con la autenticación de formularios, nombre de usuario separada / PW y todo eso. Quiero tener simplemente el registro de usuario en usuario de AD con su actual / PW. Pero quiero conectar a SQL Server a través de una cuenta especial que ya tiene los permisos adecuados para la base de datos seleccionada.

He hecho esto en ASP clásico con el escenario siguiente

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

La aplicación ASP clásico acepta un formulario HTML publicado, entonces se autentica a través de 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

Quiero este mismo comportamiento en .NET, pero sin el formulario HTML. Parece posible que cuando el usuario visita un controlador con un atributo [Autorizar]:

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

que deben deberá introducir su usuario de AD / PW (o no con IE, dependiendo de las opciones de zona y el acceso automático) y luego ser autenticada, sin embargo, utilizar el usuario dedicada en IIS para conectarse a la base de datos. ¿Cómo puedo lograr esto?

Siempre he asumido suplantación era el camino a seguir, así que esto es en mi web.config:

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

He intentado añadir esto, pero ninguna ayuda:

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

Me puede conseguir todo el trabajo para mí si uso la autenticación básica, pero eso es sólo porque mi cuenta también tiene acceso a la base de datos. Si otro usuario que está en que los Usuarios = lista, pero no tiene acceso a los intentos de DB, que recibirá:

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

falló.       Error de usuario 'dominio \ Usuario 3'.

Obviamente suplantación no está haciendo su cosa aquí.

Por lo tanto, esto tiene que ser un ejemplo bastante típico de cómo autenticar detrás del firewall de la red de Windows media. ¿Cuál es el mejor enfoque? He pensado en una costumbre AuthorizeAttribute usando un código similar al en ASP. Net MVC Esto parece más cerca de cómo funcionaban las cosas en la aplicación ASP clásico, pero por alguna razón pensé que sólo podía conseguir que todo funcione con la configuración y configuation solos.

EDIT1:

Después de leer algunos de Barry Dorrans' A partir seguridad de ASP.NET anoche, parece que puedo cambiar el usuario de la aplicación de la piscina y tienen que ser el usuario que realiza el servidor de base de datos SQL. ¿Está bien? O se trata de los usuarios Anon en la configuración del sitio web que golpea el DB?

intentado cambiar el usuario grupo de aplicación, pero la cuenta no es parte del grupo IIS_WPG. Que se requiere, ¿verdad?

Edit2: Con autenticación básica marcada, anon comprueba con el usuario especificado, me sale el siguiente:

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 

Con la autenticación básica no se controla, anon comprueba con el usuario especificado, me sale una página en blanco. Inspección con rendimientos violinista:

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
¿Fue útil?

Solución

Si se asume que desea acceder al servidor SQL con Windows Auth, a continuación, cambiar la identidad del grupo de aplicaciones es el camino a seguir.

En Web.config que necesita para impersonate="false" conjunto o ASP.NET tratará de utilizar las credenciales del cliente para conectarse a la base de datos en lugar de del grupo de aplicación (es decir, se ve como la suplantación está haciendo exactamente lo que pidió que hacer ).

En IIS debe habilitar autenticación integrada de Windows y se puede deshabilitar el acceso anónimo si lo desea.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top