在 SharePoint 中使用 SqlErrorLog 访问 Elmah.axd,而不将用户添加到数据库
-
20-09-2019 - |
题
我已经安装/配置 埃尔玛 在我的个人 SharePoint 开发环境中,一切运行良好,因为我以管理员身份登录等。我正在使用 MS Sql Server 错误日志。(我也在使用 日志4网 处理 DEBUG/INFO/etc 级别的日志记录,日志语句也存储在数据库中,与 ELMAH 位于同一个表中。)
但是,在实际的开发服务器(不是我的个人环境)上,当我访问 http://example/elmah.axd 我收到错误“用户‘NT AUTHORITY\ANONYMOUS LOGON’登录失败”。我知道这是“双跳问题”的传统错误,但我什至不希望传递我的凭据 - 我只想使用应用程序池身份的凭据进行数据库访问。使用 SP 对象模型时,SPSecurity.RunWithElevatedPrivileges 可用;但是,我不想修改 Elmah 源代码。
我的生产环境不允许使用 SQL Server 身份验证,将模拟更改为 false,或者直接授予自己对数据库的权限。
我怎样才能让它发挥作用?我错过了什么吗?
解决方案
我的生产环境排除了SQL Server身份验证的使用,将模仿更改为False或直接在DB上允许自己的权限。
那么你别无选择,只能修改 Elmah 源码。对不起。
这与双跳问题关系不大,而与 ASP.NET 中的模拟机制记录不全有关。根据 本文, , 显然 <identity impersonate="true" />
导致 ASP.NET 模拟默认的 IIS 匿名帐户 (IUSR_机器名)。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 处理。我自己测试过这个并且有效。祝你好运。