6

Número: En ASP.NET 4.0, uso el servicio web ReportService2005.asmx de mi servidor SSRS 2005 para obtener una lista de informes. También en .NET, utilizo Entity Framework para comunicarme con mi base de datos MS-SQL 2005. Cuando uso Visual Studio Development Server como mi servidor web, las llamadas a SSRS y SQL funcionan bien. Pero cuando cambio a IIS 5.1, tanto SSRS como el código de entidad producen errores. Yo uso solo Windows/Autenticación integrada en IIS.¿Por qué Windows/Integrated Authentication en IIS no pasa las credenciales de usuario a SSRS y SQL?

errores: Para SSRS, consigo The request failed with HTTP status 401: Unauthorized.

Para Entity Framework, consigo Login failed for user ''. The user is not associated with a trusted SQL Server connection.

soluciones intentadas: en el web.config añadí <identity impersonate="true" /> y que los errores de Entity Framework fijos pero no errores de SSRS. Expandí la referencia identity para incluir mi nombre de usuario y contraseña, y eso corrigió todos los errores.

Pregunta: ¿Por qué la especificación de mi nombre de usuario y contraseña corregir los errores, y por qué dicen SQL No estoy especificando un nombre de usuario ('')? Pensé que la Autenticación de Windows suplantaba automáticamente al usuario actual. ¿Cómo puedo solucionar esto sin tener que codificar una cuenta de "servicio" en el web.config?

Respuesta

10

La autenticación integrada o de Windows significa que el usuario se identifica usando credenciales (o token) de Windows, pero eso no significa que la solicitud se esté ejecutando bajo ese usuario. El tiempo de ejecución de ASP.NET ejecutará la solicitud en identidad de proceso de trabajo (Pool de aplicaciones) a menos que lo configure para suplantar alguna otra identidad.

Por lo tanto, cuando accede al sitio utilizando el servidor de desarrollo, el servidor se ejecuta con su identidad y, por lo tanto, el acceso a SSRS y al servidor SQL se realiza con su identidad y funciona.

Cuando cargó su sitio en IIS, la solicitud ASP.NET se ejecutará con la identidad configurada para el grupo de aplicaciones. Normalmente, esta identidad es un usuario local y, por lo tanto, se denegaría el acceso a los recursos de la red, como SSRS o Sql Server. Al agregar <identity impersonate="true" username="your name" ../>, ASP.NET ejecutará las solicitudes bajo su identidad y eso debería funcionar tanto para SSRS como para el servidor Sql.

El curioso caso aquí es <identity impersonate="true" /> - bajo esta configuración, ASP.NET se hará pasar identidad de Windows actualmente autenticada. Sin embargo, para que esto funcione correctamente, ha configurado IIS y ASP.NET en la autenticación integrada y denegar el acceso anónimo (tanto en ASP.NET como en IIS). Si no lo hace, puede que no se autentique la identidad del usuario actual y la solicitud se ejecutará bajo la identidad del usuario anónimo (como se configuró en IIS). Si marcó la autenticación integrada en IIS pero no en ASP.NET, entonces la identidad no se pasaría a la solicitud de ASP.NET. Debe verificar su entorno para ver qué escenario exacto había enfrentado, pero el resultado final fue que su solicitud ASP.NET se estaba ejecutando bajo una credencial que tiene acceso a SQL Server pero no a SSRS.

+0

+1 respuesta sólida. – JonH

+1

Estás en lo correcto. Terminé usando '' en web.config y '((WindowsIdentity) HttpContext.Current.User.Identity) .Impersonate()' para la única referencia a SSRS y que me suplantó correctamente . –

6

También debe tener en cuenta el problema del "doble salto"; esto significa que sus credenciales solo se pueden usar dos veces.

Si está accediendo a un sitio web mediante autenticación y suplantación de Windows, ese sitio web puede llamar a otro servicio como usted. Si ese otro servicio es otro sitio web (es decir, Reporting Services) que a su vez llama a otro servicio (p.base de datos) no puede pasar sus credenciales nuevamente. Esto significa que la base de datos lanzará un error si espera credenciales del usuario.

Cuestiones relacionadas