* 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
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. –
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
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. –