db에 사용자를 추가하지 않고 SharePoint에서 sqlerrorlog로 Elmah.axd에 액세스
-
20-09-2019 - |
문제
설치/구성했습니다 엘마 내 개인 SharePoint Dev 환경에서 관리자 등으로 로그인 한 이후로 모든 것이 잘 작동합니다. MS SQL Server 오류 로그를 사용하고 있습니다. (나도 사용하고 있습니다 log4net 디버그/정보 등을 처리하려면 Elmah 's와 동일한 테이블에 DB에 저장됩니다.)
그러나 실제 Dev 서버 (내 개인 환경이 아님)에서 액세스 할 때 http : //example/elmah.axd "사용자 'NT Authority 익명 로그온에 로그인 실패"오류가 발생합니다. 나는 이것이 "이중 홉 문제"의 기존 오류라는 것을 이해하지만 내 자격 증명이 전달되기를 원하지 않습니다. 응용 프로그램 풀 ID의 자격 증명으로 데이터베이스 액세스가 이루어지기를 원합니다. SP 객체 모델을 사용할 때 SPSECURITY.RUNWITHELEVATEDPRIVILEGES를 사용할 수 있습니다. 그러나 나는 Elmah 소스를 수정하고 싶지 않습니다.
내 생산 환경은 SQL Server 인증 사용, 사칭을 허위로 변경하거나 DB에 직접 권한을 부여 할 수 있습니다.
이것을 어떻게 작동시킬 수 있습니까? 내가 뭔가를 놓치고 있습니까?
해결책
내 생산 환경은 SQL Server 인증 사용, 사칭을 허위로 변경하거나 DB에 직접 권한을 부여 할 수 있습니다.
그런 다음 Elmah 소스를 수정하는 것 외에는 선택의 여지가 없습니다. 죄송합니다.
이는 이중 홉 문제와 관련이 없으며 ASP.NET에서 가장 잘 문서화되지 않은 가장 메커니즘과 관련이 있습니다. 에 따르면 이 기사, 보기에 <identity impersonate="true" />
ASP.NET가 기본 IIS 익명 계정 (IUSR_)을 가장합니다.machineName). SharePoint는 이것을 필요로하지만 원격 데이터베이스에 액세스하려고하는 것은 좋지 않으므로 분명히해야 할 일이 있습니다.
네,에 따르면 이 기사 Elmah 소스 코드를 편집하고 추상 클래스에서 파생 된 새로운 클래스를 만들어야합니다. ErrorLog
. 그런 다음이 새로운 클래스는 원래 sqlerrorlog 클래스 주변의 래퍼 역할을하며 메소드를 RWEP 블록으로 실행합니다. 여기있어:
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;
}
}
Elmah Project에서 SharePoint를 참조해야하며 Elmah.dll은 게재해야합니다. 나는 이것을 직접 테스트했고 그것은 작동합니다. 행운을 빕니다.