0

我已经在我的个人 SharePoint 开发环境中安装/配置了Elmah,因为我以管理员身份登录,所以一切都很好。我正在使用 MS Sql Server 错误日志。(我也使用log4net来处理 DEBUG/INFO/etc 级别的日志记录,并且日志语句也存储在数据库中,与 ELMAH 的表在同一个表中。)

但是,在实际的开发服务器(不是我的个人环境)上,当我访问http://example/elmah.axd时,我收到错误“用户 'NT AUTHORITY\ANONYMOUS LOGON' 登录失败”。我知道这是“双跳问题”的传统错误,但我什至不希望传递我的凭据 - 我只想使用应用程序池标识的凭据进行数据库访问。使用 SP 对象模型时,SPSecurity.RunWithElevatedPrivileges 可用;但是,我不想修改 Elmah 源。

我的生产环境禁止使用 SQL Server 身份验证、将模拟更改为 false 或直接授予自己对数据库的权限。

我怎样才能让它工作?我错过了什么吗?

4

1 回答 1

0

我的生产环境禁止使用 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。我自己对此进行了测试,并且可以正常工作。祝你好运。

于 2010-04-15T15:10:51.350 回答