我的生产环境禁止使用 SQL Server 身份验证、将模拟更改为 false 或直接授予自己对数据库的权限。
那么你别无选择,只能修改 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 项目中引用 SharePoint,并且您的 Elmah.dll 需要进行 GAC。我自己对此进行了测试,并且可以正常工作。祝你好运。