Pergunta

Eu instalei/configurado Elmah No meu ambiente pessoal de desenvolvimento do SharePoint e tudo funciona muito bem, já que estou conectado como administrador, etc. Estou usando o log de erros do MS SQL Server. (Eu também estou usando log4net Para lidar com a depuração/informação/ETC, o registro e as instruções de log também são armazenadas no banco de dados, na mesma tabela que o Elmah's.)

No entanto, no servidor de desenvolvimento real (não no meu ambiente pessoal), quando eu acessar http: //example/elmah.axd Recebo o erro "O login falhou para o usuário 'NT Authority Anonymous Logon'". Entendo que este é o erro tradicional para o "problema de dupla hop", mas eu nem quero que minhas credenciais sejam repassadas - gostaria que o acesso ao banco de dados fosse feito com as credenciais da identidade do pool de aplicativos. Ao usar o modelo de objeto SP, está disponível o SPSecurity.RunWithelevatedPrivileges; No entanto, não quero modificar a fonte Elmah.

Meu ambiente de produção impede o uso da autenticação do SQL Server, alterando a representação para falsas ou me dando permissões no banco de dados.

Como posso fazer isso funcionar? Estou esquecendo de algo?

Foi útil?

Solução

Meu ambiente de produção impede o uso da autenticação do SQL Server, alterando a representação para falsas ou me dando permissões no banco de dados.

Então você não tem escolha a não ser modificar a fonte Elmah. Desculpe.

Isso tem menos a ver com o problema do duplo salto e mais a ver com o mecanismo de representação mal documentado no ASP.NET. De acordo com Este artigo, aparentemente <identity impersonate="true" /> faznome da maquina). O SharePoint precisa disso, mas não é bom tentando acessar um banco de dados remoto, então obviamente há algo que você precisa fazer.

Sim, de acordo com Este artigo Você deve editar o código -fonte Elmah e criar uma nova classe derivada da classe abstrata ErrorLog. Esta nova classe atua como um invólucro em torno da classe original do SQLERRORLOG e executa seus métodos em um bloco RWEP. Aqui 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;
    }
}

Escusado será dizer que agora você precisará fazer referência ao SharePoint no projeto Elmah e seu Elmah.dll precisará ser obtido. Eu mesmo testei isso e funciona. Boa sorte.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top