Acessando o Elmah.axd com o SQLERRORLOG no SharePoint sem adicionar usuário ao dB
-
20-09-2019 - |
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?
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.