应用程序池用户无法执行存储过程

时间:2013-03-29 23:37:18

标签: sql-server sql-server-2008-r2 database-permissions

背景

我正在使用SQL Server 2008 R2的全文搜索来检索大量文档,并希望使用sys.dm_fts_parser的结果来突出显示匹配的术语。

这样做通常需要应用程序用户不应拥有的权限。有一个解决方案proposed on MSDN以及一个deleted question/answer on StackOverflow(请参阅why it was deleted)。

问题

我正在尝试实施该解决方案,但无法向IIS App Pool用户授予执行权限。

我尝试了什么

在安全/登录下的SSMS中,我创建了一个用户IIS APPPOOL\My App。我授予该用户db_datareaderdb_datawriter表格访问权限,并且工作正常。

再次在SSMS中:

  • 在MyDB /可编程性/存储过程下,我右键单击dbo.usp_fts_parser
  • 选择“属性”,“权限”。
  • 点击搜索...
  • 添加IIS APPPOOL\My App
  • 在显式选项卡上,执行第I行检查授予
  • 点击确定

问题

为什么此拨款不足以执行dbo.usp_fts_parser

备注

  • 我可以通过以管理员身份登录的SSMS执行它。
  • 如果我暂时将系统管理员服务器角色授予IIS APPPOOL\My App,则代码可以执行dbo.usp_fts_parser

2 个答案:

答案 0 :(得分:2)

如果您查看官方MSDN help for this system function,那么您会发现它确实需要,

  

权限

     

需要sysadmin固定服务器角色和访问权限   对指定的停止列表的权利。

如此说,该用户必须是sysadmin固定服务器角色的成员。我认为没有任何解决办法。

答案 1 :(得分:1)

以下是最初在https://stackoverflow.com/questions/3816023/sys-dm-fts-parser-permission/3816407#3816407发布的答案:

在您的数据库中:

create procedure usp_fts_parser
    @query nvarchar(max)
with execute as caller
as
select * from sys.dm_fts_parser(@query, 1033, 0, 0);
go

grant execute on usp_fts_parser to [<some low priviledged user>]
go

create certificate sign_fts_parser
    encryption by password = 'Password#1234'
    with subject = 'sign_fts_parser';
go

add signature to object::usp_fts_parser
by certificate sign_fts_parser with password = 'Password#1234';
go

alter certificate sign_fts_parser
remove private key;
go

backup certificate sign_fts_parser
to file = 'c:\temp\sign_fts_parser.cer';
go

在主人:

create certificate sign_fts_parser
from file = 'c:\temp\sign_fts_parser.cer';
go  

create login login_sign_fts_parser
from certificate sign_fts_parser;
go

grant control server to login_sign_fts_parser;
go

我刚刚在SQL Server 2008上测试了这些步骤,并且我能够从低权限登录中执行usp_fts_parser。与原始帖子答案的唯一区别是我在存储过程中添加了显式GRANT EXECUTE,并删除了无回复的启用可信任步骤。在您的情况下,<low priviledged user>应为IIS APPPOOL\My App,假设您在ASP应用程序中使用模拟。

调用sys.dm_fts_parser所需的权限来自过程中的签名,该签名通过导出并导入master数据库的证书具有显式的CONTROL SERVER权限(最高可能的权限)。由于证书的私钥被明确删除,因此无法滥用与此证书关联的高权限,因为它无法再签署任何内容(私钥永远丢失)。有关详细信息,请参阅Module Signing (Database Engine)

请注意,每次修改存储过程时,必须重复上述步骤。该过程的任何ALTER都将导致相关签名的自动,静默,丢弃。丢失模块签名意味着丢失从此签名派生的权限,因此对sys.dm_fts_parser的后续调用将对低权限用户失败。