代码之家  ›  专栏  ›  技术社区  ›  Chloraphil

在SharePoint中使用sqlErrorLog访问elmah.axd,而不向数据库添加用户

  •  0
  • Chloraphil  · 技术社区  · 14 年前

    我已安装/配置 Elmah 在我的个人SharePointDev环境中,一切都很好,因为我以管理员等身份登录。我使用的是MS SQL Server错误日志。(我也在使用 log4net 为了处理调试/info/etc级别的日志记录和日志语句也存储在数据库中,与elmah的表相同。)

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

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

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

    1 回复  |  直到 14 年前
        1
  •  0
  •   Jacobs Data Solutions    14 年前

    我的生产环境排除了 使用SQL Server身份验证, 将模拟更改为假,或 授予自己对数据库的权限 直接。

    然后你别无选择,只能修改elmah源代码。对不起的。

    这与双跳问题的关系不大,而与ASP.NET中记录不良的模拟机制有关。根据 this article ,显然 <identity impersonate="true" /> 使ASP.NET模拟默认的IIS匿名帐户(IUSR_ 机器名 )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将需要gaced。我已经亲自测试过了,而且效果很好。祝你好运。