在SharePoint中使用SqlErrorLog访问Elmah.axd,而无需将用户添加到db

时间:2010-01-15 17:43:03

标签: sharepoint-2007 log4net elmah

我已在我的个人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或直接授予自己对db的权限。

我怎样才能让它发挥作用?我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

  

我的生产环境排除在外   使用SQL Server身份验证,   将假冒变为虚假,或   给自己db的权限   直接

然后你别无选择,只能修改Elmah来源。遗憾。

这与双跃点问题关系不大,而与ASP.NET中模拟记录不良的机制有关。根据{{​​3}},显然<identity impersonate="true" />会导致ASP.NET模拟默认的IIS匿名帐户(IUSR_ machinename )。 SharePoint需要这样做,但是你尝试访问远程数据库并不好,所以显然你需要做些什么。

是的,根据this article,你必须编辑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。我自己测试了这个并且它有效。祝你好运。