服务代理不使用路由中指定的用户

时间:2015-04-13 09:40:27

标签: sql-server sql-server-2008 sql-server-2008-r2 sql-server-2012 service-broker

我正在尝试使用Windows登录用户将消息从1台服务器发送到另一台服务器。我为此创建了路线:

CREATE ROUTE [SB_Server1_Server2Route]  
      AUTHORIZATION [COMPANY\SVC.SQLServiceBroker] 
      WITH SERVICE_NAME = '//Server1/Server2/UpdatedRecord_TargetService',
      ADDRESS = 'tcp://Server2:4022';

我正在使用以下查询/程序发送消息:

EXEC [dbo].[SB_SendBrokerMessage] '//Server1/Server2/UpdatedRecord_InitiatorService',
'//Server1/Server2/UpdatedRecord_TargetService', @XML;


CREATE PROCEDURE [dbo].[SB_SendBrokerMessage]
    @FromService sysname ,
    @ToService sysname ,
    @MessageBody XML
AS
    BEGIN
        SET NOCOUNT ON;
        IF ( @MessageBody IS NOT NULL
             AND @FromService IS NOT NULL
             AND @ToService IS NOT NULL
           )
            BEGIN
                DECLARE @conversation_handle UNIQUEIDENTIFIER;

                BEGIN TRANSACTION;

                BEGIN DIALOG CONVERSATION @conversation_handle
                    FROM SERVICE @FromService
                    TO SERVICE @ToService
                    WITH ENCRYPTION = OFF;

                SEND ON CONVERSATION @conversation_handle (@MessageBody);

                COMMIT TRANSACTION;
            END;
    END;
GO

我在日志中遇到以下错误:

  

用户' COMPANY \ AnotherUser的Service Broker登录尝试。'失败   错误:'连接握手失败。登录   ' COMPANY \ AnotherUser'没有CONNECT权限   端点。州84。'。 [客户:192.168.21.61]

所以问题是:为什么它不使用路线中指定的用户?

2 个答案:

答案 0 :(得分:2)

路线上的授权条款(或其他任何内容)指定谁拥有路线,而不是人们将连接的路由。幸运的是,可以轻松解决您的问题:将端点上的连接权限授予用户需要的任何权限。

答案 1 :(得分:1)

Ben已经告诉过你为什么使用AUTHORIZATION子句与Service Broker连接无关。

要设置两个实例以便能够交换Service Broker消息,您需要设置Service Broker Transport Security。您可以选择基于证书的身份验证(请参阅How does Certificate based authentication work)或基于Windows的身份验证。传输层安全性与当前用户完全没有。当前用户正在运行Service Broker谓词并不重要,它只允许所涉及的两个实例相互连接。我强烈建议使用基于证书的身份验证,但如果您必须*使用Windows,则必须向对等服务帐户授予CONNECT权限。

Service Broker中存在第二层安全性,即对话安全性(请参阅Conversations Authentication)。这允许两个Service Broker服务相互进行身份验证并交换消息。这再次与当前连接的用户无关。如果指定则需要创建remote service binding个对象。总是以证书为基础。

最后,当在传输层和会话层都设置了所有Service Broker安全性时,您还必须指定哪些SQL用户有权使用此基础结构,并且这是通过授予的RECEIVE权限来控制的。承载服务的队列。