签名激活过程中的不可信安全上下文

Man*_*eld 5 sql-server stored-procedures linked-server service-broker sql-server-2014

我有一个用于查询链接服务器的服务代理队列的激活过程。我已使用此处找到的方法签署了该程序。但是,我不断在 sql server 日志中看到以下消息:

在队列 'DBName.dbo.TestReceiveQueue' 上运行的激活过程 '[dbo].[TestProc]' 输出以下内容: '访问远程服务器被拒绝,因为当前安全上下文不受信任。

奇怪的是我在同一个数据库中有几个不同的激活程序,由同一个证书签名,也做链接服务器查询,并且工作正常。出于某种原因,这个程序拒绝。

这是一些(主要)重现问题的代码。我已经创建了证书和关联的登录名。

CREATE PROCEDURE TestProc
WITH EXECUTE AS OWNER
AS
BEGIN
    SET NOCOUNT ON;

DECLARE @convHandle UNIQUEIDENTIFIER;
DECLARE @msgTypeName SYSNAME;
DECLARE @status TINYINT;
DECLARE @srvName NVARCHAR(512);
DECLARE @srvConName NVARCHAR(256);
DECLARE @msgTypeValidation AS NCHAR(2);
DECLARE @msgBody NVARCHAR(256);
DECLARE @cmd AS NVARCHAR(50);


RECEIVE TOP(1)
        @convHandle = conversation_handle,
        @msgTypeName =  message_type_name,
        @status = status,
        @srvName = service_name,
        @srvConName = service_contract_name,
        @msgTypeValidation = validation,
        @msgBody = CAST(message_body AS NVARCHAR(256))
        FROM TestReceiveQueue;

    --SELECT @convHandle, @msgBody

    IF (@@ROWCOUNT != 0)
    BEGIN

        SELECT * FROM openquery(LINKEDSERVERNAME, 'SELECT * FROM LINKEDSERVERDB.SCHEMA.TABLE')

        END CONVERSATION @convHandle
    END

END
GO

CREATE MESSAGE TYPE [TestMessageType] VALIDATION = NONE;

CREATE CONTRACT TestContract (TestMessageType SENT BY INITIATOR)

CREATE QUEUE [dbo].[TestReceiveQueue] With STATUS = ON, RETENTION = OFF, ACTIVATION (STATUS = ON, PROCEDURE_NAME = [dbo].[TestProc], MAX_QUEUE_READERS = 1, EXECUTE AS OWNER ), POISON_MESSAGE_HANDLING (STATUS = OFF) ON [PRIMARY]
CREATE QUEUE [dbo].[TestSendQueue] WITH STATUS = ON, RETENTION = OFF, POISON_MESSAGE_HANDLING (STATUS = OFF) ON [PRIMARY]

CREATE SERVICE [TestReceiveService] ON QUEUE [dbo].[TestReceiveQueue] (TestContract)

CREATE SERVICE [TestSendService] ON QUEUE [dbo].[TestSendQueue] (TestContract)


Drop Procedure TestProc

ADD SIGNATURE TO OBJECT::[TestProc]
BY CERTIFICATE [ServiceBrokerProcsCert]
WITH PASSWORD = 'PASSWORDHERE'
GO
Run Code Online (Sandbox Code Playgroud)

有什么办法可以进一步调试,找出为什么我收到这个错误?我在对话中尝试了 ssbdiagnose 并且没有任何配置错误。我还尝试记录CURRENT_USER作为 dbo 返回的激活 sproc的内部。

当我将数据库标记为值得信赖时,它当然可以工作(但这是我试图避免的)。

小智 1

如果数据库是可信关闭的,则过程将仅在签名用户的上下文中运行,而不是如您所期望的在其所有者的上下文中运行。

将链接服务器权限分配给与ServiceBrokerProcsCert关联的用户,这是运行上下文签名激活过程的正确用户。