db에 사용자를 추가하지 않고 SharePoint에서 sqlerrorlog로 Elmah.axd에 액세스

StackOverflow https://stackoverflow.com/questions/2073630

  •  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은 게재해야합니다. 나는 이것을 직접 테스트했고 그것은 작동합니다. 행운을 빕니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top