2012-06-25 11 views
24

* Los detalles del entorno se describen en la parte inferior.cómo reenviar el desafío de autenticación básica a la url del administrador de informes

Estoy intentando crear una solución de autenticación para los servicios de informes.

Los clientes en línea deben autenticarse utilizando nuestra base de datos de clientes existente, mientras que los usuarios administrativos locales pueden usar una autenticación simple y básica.

he hecho una extensión de seguridad a SSRS usando los ejemplos CodePlex y la forma en que uso para emitir el reto básico es el siguiente

public void GetUserInfo(out IIdentity userIdentity, out IntPtr userId) 
{ 
    if (HttpContext.Current != null && HttpContext.Current.User != null) 
     userIdentity = HttpContext.Current.User.Identity; 
    else 
    { 
     HttpContext.Current.Response 
      .AddHeader("WWW-Authenticate", "Basic realm=\"ReportServer\""); 
     HttpContext.Current.Response.Status = "401 Unauthorized"; 
     HttpContext.Current.Response.Flush(); 
     HttpContext.Current.Response.Close(); 
     userIdentity = new GenericIdentity("not authorized"); 
    } 

    userId = IntPtr.Zero; 
} 

De esta forma cuando un usuario que no han pasado por el método LogonUser (es decir, acceso directo a la url, despliegue de informe de ofertas, no las aplicaciones de usuario normales) se desafía con una ventana emergente de inicio de sesión/contraseña básica. Para apoyar este Hice un HttpModule de la siguiente manera

void IHttpModule.Init(HttpApplication context) 
{ 
    context.AuthenticateRequest += CustomAuthenticateRequest; 
} 

void CustomAuthenticateRequest(object sender, EventArgs e) 
{ 
    var app = sender as HttpApplication; 

    if (app == null) return; 

    var basicAuth = app.Context.Request.Headers["Authorization"]; 

    if (!string.IsNullOrEmpty(basicAuth)) 
    { 
     var loginpass = Encoding.Default.GetString(
      Convert.FromBase64String(basicAuth.Replace("Basic ", ""))).Split(':'); 
     if (loginpass.Length == 2 
      && loginpass[0] == adminUser 
      && loginpass[1] == adminPass) 
     { 
      app.Context.User = new GenericPrincipal(
       new GenericIdentity(adminUser), null); 
     } 
    } 
} 

Esto funciona bien cuando se accede a /ReportServer URL, consigo reté, introduzca el nombre de usuario administrador codificado/PASS y se conectó.

El problema es cuando se accede a /Reports consigo

System.NET.WebException: Error de la solicitud con el estado HTTP 401: no autorizado

Quiero saber cómo puedo pasar el iniciar sesión/pasar desafío hasta /Reports

Estoy ejecutando SqlServer 2012 junto con Reporting Servi CES 2012, pero los trabajos internos no han cambiado desde SSRS 2008-R2

En mi web.config tengo

<authentication mode="None" /> 
<identity impersonate="false" />, and the entry for the httpmodule 

En rssrvpolicy.config la CodeGroup para mi es HttpModule con FullTrust

En rsreportserver.config tengo

<AuthenticationTypes> 
     <Custom/> 
    </AuthenticationTypes>, and the entry for the security extension 

No tengo SSL configurado, sin embargo, y las fijaciones están en el ir predeterminado

+0

Todavía me encantaría una respuesta, pero por ahora he hecho una solución. En mi HttpModule solo permito el acceso al administrador de informes a través del acceso local a la máquina. Al acceder desde la máquina local, configuré el usuario de contexto como administrador. Una solución tremendamente fea, pero una solución sin fin. –

+0

ReportManager habla con ReportServer utilizando la misma API SOAP pública, por lo que tiene que autenticarse de alguna manera. Supongo que debe agregar el mismo módulo a los archivos de configuración de ReportManager. Espero que ReportManager use la misma cookie de autenticación o credenciales para hablar con ReportServer. – user1578107

+0

La seguridad personalizada es posible. Si anula los métodos de Autenticación y Autorización en el nivel de servicio de SSRS, entonces solo se trata de incluir las funciones con el administrador de ssrs y proporcionar una página de inicio de sesión predeterminada. –

Respuesta

4

A partir del mensaje de error, parece que se produce el error de autenticación en la representación de la interfaz de usuario del administrador de informes. Vaya a la carpeta, c: \ Archivos de programa \ Microsoft SQL Server \ MSRS11.MSSQLSERVER \ Reporting Services \ ReportManager \, busque el archivo web.config y aplique los siguientes cambios.

<authentication mode="None" /> 
<identity impersonate="false" />, and the entry for the httpmodule 
Cuestiones relacionadas