如何让ELMAH与SQL Server配合使用(权限问题)

8
我已经在我的(Cassini)开发服务器上成功使用了ELMAH,感到非常满意。但是现在我正在尝试将所有内容移动到我的生产服务器(IIS7),这个美好的时光看起来就要结束了。
我已经通过"IIS7的陷阱",但是文档中应该更好地强调,如果我只使用内存日志,那么它可以工作。
然而,我正在尝试让它使用SQL Server日志(就像我在开发系统上做的那样),但是我遇到了以下错误:
"拒绝对对象ELMAH_GetErrorsXml的EXECUTE权限"
好吧,我知道如何授予数据库权限,但我真的很难理解需要授予哪个用户以及哪些存储过程/表的访问权限。
让我感到困惑的是,在我的开发服务器上,我没有像这样做任何事情就使它正常运行。我唯一能看到的区别是,在我的开发服务器上,它似乎连接为NT AUTHORITY\IUSR,而在我的生产服务器上,它似乎连接为NT AUTHORITY\NETWORK SERVICE。(它只是使用可信连接,所以我没有显式地配置它 - 我认为这与Web服务器有关)。更新:我后来确定,因为我正在使用Cassini,它实际上是作为管理员(即我)而不是IUSR登录,这就解释了为什么我没有遇到任何权限问题。
在我的开发服务器上,IUSR帐户是公共数据库角色的成员,并且可以访问所需的数据库(同样是作为“public”)。没有明确授予对象级权限。[请参见上面的更新 - 这是无关紧要的]。
在我的生产服务器上,我已经以完全相同的方式添加了NETWORK SERVICE(公共数据库角色,作为“public”对数据库的明确访问)。然而,我得到了这个权限错误。为什么?!!【请参见上面的更新 - 我之所以没有获得权限错误的唯一原因是我作为管理员运行】。

当然,如果它只是在本地工作的“幸运”,我需要知道授予访问权限的哪些SPs/表。 我猜测应该是所有3个SP和包括表,但最好(再次)查看一些明确说明的文档。

2个回答

13

给用户USER_NAME授予执行权限所需的SQL示例:

GRANT EXECUTE ON ELMAH_GetErrorsXml TO USER_NAME
GRANT EXECUTE ON ELMAH_GetErrorXml TO USER_NAME
GRANT EXECUTE ON ELMAH_LogError TO USER_NAME

7

您是否在web.config中提供了完整的连接字符串给ELMAH?如果是这样,您应该知道需要授予哪个数据库用户权限,对吧?是的,权限将用于执行三个ELMAH存储过程...

以下是我使用过的配置:

<elmah>
    <errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="elmah" />
</elmah>

<connectionStrings>
    <add name="elmah" connectionString="Data Source=XXX;Initial Catalog=XXX;User Id=XXX;Password=XXX;" providerName="System.Data.SqlClient" />
</connectionStrings>

1
@Eric:我正在使用可信连接,因此用户实际上取决于它运行的机器。如果必须授予显式权限,那么好吧,我可以做到。感谢您确认只有这3个存储过程。为了使自己与用户隔离开来,我将创建一个数据库角色,并确保适当的用户(可能是NETWORK SERVICE)是该角色的成员。很遗憾ELMAH没有在设置中创建角色(例如,像ASP.NET Membership提供程序为SQL Server所做的那样)。他们也没有提到需要这样做! - Gary McGill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接