Авторизация с Websphere MQ 6 - PullRequest
       13

Авторизация с Websphere MQ 6

2 голосов
/ 19 ноября 2009

У меня есть серверная часть IBM WebSphere MQ версии 6 на виртуальной машине под управлением Windows Server 2003, расположенной на рабочем столе Vista. На рабочем столе установлен клиент.

У меня есть небольшая тестовая программа (из их примеров кода), которая помещает сообщение в очередь и снова удаляет его. Эта программа работала при запуске на сервере напрямую с привязкой к серверу. Однако я не могу заставить его работать со стороны клиента с привязкой клиента.

Я получаю ошибку CompCode 2, Reason 2035, которая является ошибкой авторизации.

Я подозреваю, что это связано с тем, что программа по умолчанию работает под моим пользователем, который находится в домене, о котором виртуальная машина не знает (и не может получить к нему доступ).

Я настроил локального пользователя в виртуальной машине, к которому я хотел бы подключиться (пользователь: websphere, пароль: websphere), но я не совсем понимаю, как заставить все это работать. У меня есть код, который я использую ниже, и я пробовал различные комбинации настроек выхода безопасности на канале и конечных точках, но я не могу уйти от 2035.

Кто-нибудь имеет опыт работы с этим? Помощь будет высоко ценится!

Код:

using System;
using System.Collections;

using IBM.WMQ;

class MQSample
{
    // The type of connection to use, this can be:-
    // MQC.TRANSPORT_MQSERIES_BINDINGS for a server connection.
    // MQC.TRANSPORT_MQSERIES_CLIENT for a non-XA client connection
    // MQC.TRANSPORT_MQSERIES_XACLIENT for an XA client connection
    // MQC.TRANSPORT_MQSERIES_MANAGED for a managed client connection
    const String connectionType = MQC.TRANSPORT_MQSERIES_CLIENT;

    // Define the name of the queue manager to use (applies to all connections)
    const String qManager = "QM_vm_win2003";

    // Define the name of your host connection (applies to client connections only)
    const String hostName = "vm-win2003";

    // Define the name of the channel to use (applies to client connections only)
    const String channel = "S_vm_win2003";

    /// <summary>
    /// Initialise the connection properties for the connection type requested
    /// </summary>
    /// <param name="connectionType">One of the MQC.TRANSPORT_MQSERIES_ values</param>
    static Hashtable init(String connectionType)
    {
        Hashtable connectionProperties = new Hashtable();

        // Add the connection type
        connectionProperties.Add(MQC.TRANSPORT_PROPERTY, connectionType);

        // Set up the rest of the connection properties, based on the
        // connection type requested
        switch (connectionType)
        {
            case MQC.TRANSPORT_MQSERIES_BINDINGS:
                break;
            case MQC.TRANSPORT_MQSERIES_CLIENT:
                connectionProperties.Add(MQC.HOST_NAME_PROPERTY, hostName);
                connectionProperties.Add(MQC.CHANNEL_PROPERTY, channel);
                connectionProperties.Add(MQC.USER_ID_PROPERTY, "websphere");
                connectionProperties.Add(MQC.PASSWORD_PROPERTY, "websphere");
                break;
        }

        return connectionProperties;
    }

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static int Main(string[] args)
    {
        try
        {
            Hashtable connectionProperties = init(connectionType);

            // Create a connection to the queue manager using the connection
            // properties just defined
            MQQueueManager qMgr = new MQQueueManager(qManager, connectionProperties);

            // Set up the options on the queue we wish to open
            int openOptions = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_OUTPUT;

            // Now specify the queue that we wish to open,and the open options
            MQQueue system_default_local_queue =
              qMgr.AccessQueue("clq_default_vm_sql2000", openOptions);

            // Define a WebSphere MQ message, writing some text in UTF format
            MQMessage hello_world = new MQMessage();
            hello_world.WriteUTF("Hello World!");

            // Specify the message options
            MQPutMessageOptions pmo = new MQPutMessageOptions(); 
            // accept the defaults,
            // same as MQPMO_DEFAULT

            // Put the message on the queue
            system_default_local_queue.Put(hello_world, pmo);

            // Get the message back again

            // First define a WebSphere MQ message buffer to receive the message
            MQMessage retrievedMessage = new MQMessage();
            retrievedMessage.MessageId = hello_world.MessageId;

            // Set the get message options
            MQGetMessageOptions gmo = new MQGetMessageOptions(); //accept the defaults
            //same as MQGMO_DEFAULT

            // Get the message off the queue
            system_default_local_queue.Get(retrievedMessage, gmo);

            // Prove we have the message by displaying the UTF message text
            String msgText = retrievedMessage.ReadUTF();
            Console.WriteLine("The message is: {0}", msgText);

            // Close the queue
            system_default_local_queue.Close();

            // Disconnect from the queue manager
            qMgr.Disconnect();
        }

        //If an error has occurred in the above,try to identify what went wrong.

        //Was it a WebSphere MQ error?
        catch (MQException ex)
        {
            Console.WriteLine("A WebSphere MQ error occurred: {0}", ex.ToString());
        }

        catch (System.Exception ex)
        {
            Console.WriteLine("A System error occurred: {0}", ex.ToString());
        }

        Console.ReadLine();
        return 0;
    }//end of start
}//end of sample

Ответы [ 2 ]

2 голосов
/ 19 ноября 2009

При подключении Windows к Windows WMQ будет передавать SID, а также «короткий ID», который в этом случае будет «websphere». Это немного лучшая авторизация, чем при использовании не-Windows WMQ, в котором используется только короткий идентификатор. Проблема заключается в том, что кто-то на сервере, отличном от Windows, может подключиться с использованием короткого идентификатора «websphere», а поскольку SID отсутствует, WMQ примет подключение, как считалось, было учетной записью Windows.

Два способа решения этой проблемы. На хосте QMgr вы можете запускать команды setmqaut для авторизации SID, который вы фактически используете для подключения. ВМ должна иметь возможность запрашивать домен, в котором находится учетная запись Windows, а команда setmqaut должна использовать синтаксис -p user @ domain.

В качестве альтернативы, вы можете просто использовать локально определенный идентификатор в MCAUSER канала, как

ALTER CHL (название канала) CHLTYPE (SVRCONN) MCAUSER ('webaphere @ vm')

... где 'vm' - это имя виртуальной машины, и вы авторизовали учетную запись с помощью команд setmqaut или поместили ее в группу mqm или администраторов.

Имейте в виду, что только для тестирования! Любой канал с пустым или административным MCAUSER может не только администрировать WMQ, но и выполнять произвольные команды на базовом хост-сервере. В реальном мире вы создаете учетные записи с доступом к очередям и QMgr, но не имеете доступа к администрированию, и вы помещаете их во все значения MCAUSER, а затем устанавливаете MCAUSER ('nobody') для всех каналов SYSTEM.DEF и SYSTEM.AUTO. .

Многое об этом доступно на моем веб-сайте t-rob.net на страницах MQ и Ссылки. Также проверьте:

Строки комментариев: T.Rob Wyatt: То, что вы не знали, вы не знали о безопасности WebSphere MQ

Строки комментариев: T.Rob Wyatt: Безопасность WebSphere MQ нагревается

0 голосов
/ 11 августа 2010

Раньше у меня была такая же проблема. Для решения этой проблемы нам необходимо назначить учетную запись пользователя в группе MQA или группе администраторов. Затем добавьте имя пользователя учетной записи окна для пользователя MCA в канале.

Надеюсь, это поможет

...