Pregunta

He instalado / configurado Elmah en mi entorno de SharePoint dev personal y todo funciona muy bien, ya estoy conectado como aDMIN, etc. estoy utilizando el servidor de error MS Sql registro. (También estoy usando log4net para manejar debug / INFO / etc Nivel de registro y registrar las declaraciones también se almacenan en el PP, en la misma mesa que ELMAH de.)

Sin embargo, en el servidor dev real (no es mi entorno personal), cuando accedo a http: // ejemplo / ELMAH. AXD me sale el error "error de usuario 'NT AUTHORITY \ ANONYMOUS LOGON'". Entiendo que este es el error tradicional para el "problema de doble salto" pero yo no quiero ni mis credenciales que se pasan a lo largo - me al igual que el acceso a la base de datos para hacerse con las credenciales de la identidad del grupo de aplicación. Cuando se utiliza el modelo de objetos de SP la SPSecurity.RunWithElevatedPrivileges está disponible; Sin embargo, no quiero modificar la fuente Elmah.

Mi entorno de producción impide el uso de la autenticación de SQL Server, el cambio de suplantación de falsa, o darme permisos en la base de datos directamente.

¿Cómo puedo conseguir que esto funcione? Me estoy perdiendo algo?

¿Fue útil?

Solución

  

Mi entorno de producción se opone   el uso de la autenticación de SQL Server,   cambiar la suplantación a falso, o   entregándome permisos en el PP   directamente.

A continuación, usted tiene más remedio que modificar el código fuente Elmah. Lo sentimos.

Esto tiene menos que ver con el problema doble salto y más que ver con el mecanismo pobremente documentada de suplantación en ASP.NET. De acuerdo con este artículo , al parecer <identity impersonate="true" /> hace que ASP.NET para suplantar al IIS predeterminado cuenta anónima (IUSR_ machinename ). SharePoint necesita esto, pero lo hace ningún bien intentar acceder a una base de datos remota, por lo que no es, obviamente, algo que tiene que hacer.

Sí, de acuerdo con este artículo debe editar el código fuente Elmah y crear una nueva clase derivada de la clase abstracta ErrorLog. Esta nueva clase actúa entonces como una envoltura alrededor de la clase SqlErrorLog original y ejecuta sus métodos en un bloque RWEP. Aquí está:

public class SqlErrorLogWEP : ErrorLog
{
    private SqlErrorLog sqlErrorLog;

    public SqlErrorLogWEP(IDictionary config)
    {
        sqlErrorLog = new SqlErrorLog(config);
    }

    public SqlErrorLogWEP(string connectionString)
    {
        sqlErrorLog = new SqlErrorLog(connectionString);
    }

    public override string Log(Error error)
    {
        string retVal = String.Empty;
        SPSecurity.RunWithElevatedPrivileges(delegate()
        {
            retVal = sqlErrorLog.Log(error);
        });

        return retVal;
    }

    public override ErrorLogEntry GetError(string id)
    {
        ErrorLogEntry retVal = default(ErrorLogEntry);

        SPSecurity.RunWithElevatedPrivileges(delegate()
        {
            retVal = sqlErrorLog.GetError(id);
        });

        return retVal;
    }

    public override int GetErrors(int pageIndex, int pageSize, System.Collections.IList errorEntryList)
    {
        int retVal = -1;

        SPSecurity.RunWithElevatedPrivileges(delegate()
        {
            retVal = sqlErrorLog.GetErrors(pageIndex, pageSize, errorEntryList);
        });

        return retVal;
    }
}

No hace falta decir que ahora tendrá que hacer referencia a SharePoint en el proyecto y su Elmah Elmah.dll tendrá que ser GACed. He probado esto por mí mismo y funciona. Buena suerte.

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