MQRC_NOT_AUTHORIZED при создании CCDT для клиента MQ.NET

Pingpong спросил: 28 марта 2018 в 03:45 в: c#

Ошибка при доступе к серверу MQ через .NET Client. При создании CCDT не запрашиваются учетные данные. Но MQ-сервер ищет его по какой-то причине.

Я не могу найти никакой информации, которая охватывает как CCDT, так и ошибку ниже вместе.

IBM.WMQ.MQException: MQRC_NOT_AUTHORIZED----- cmqxrsrv.c : 2356 -------------------------------------------------------
    17/04/2018 23:50:44 - Process(1848.16) User(SYSTEM) Program(amqzlaa0.exe)
                          Host(APPLE) Installation(Installation1)
                          VRMF(8.0.0.5) QMgr(LocalQM)    AMQ5540: Application 'bin\Debug\Producer.exe' did not supply a user ID
    and password    EXPLANATION:
    The queue manager is configured to require a user ID and password, but none was
    supplied.
    ACTION:
    Ensure that the application provides a valid user ID and password, or change
    the queue manager configuration to OPTIONAL to allow applications to connect
    which have not supplied a user ID and password. 
    ----- amqzfuca.c : 4311 -------------------------------------------------------
    17/04/2018 23:50:44 - Process(1848.16) User(SYSTEM) Program(amqzlaa0.exe)
                          Host(APPLE) Installation(Installation1)
                          VRMF(8.0.0.5) QMgr(LocalQM)    AMQ5541: The failed authentication check was caused by the queue manager
    CONNAUTH CHCKCLNT(REQDADM) configuration.    EXPLANATION:
    The user ID 'mqclient' and its password were checked because the user ID is
    privileged and the queue manager connection authority (CONNAUTH) configuration
    refers to an authentication information (AUTHINFO) object named
    'SYSTEM.DEFAULT.AUTHINFO.IDPWOS' with CHCKCLNT(REQDADM).     This message accompanies a previous error to clarify the reason for the user ID
    and password check.
    ACTION:
    Refer to the previous error for more information.     Ensure that a password is specified by the client application and that the
    password is correct for the user ID. The authentication configuration of the
    queue manager connection determines the user ID repository. For example, the
    local operating system user database or an LDAP server.     To avoid the authentication check, you can either use an unprivileged user ID
    or amend the authentication configuration of the queue manager. You can amend
    the CHCKCLNT attribute in the CHLAUTH record, but you should generally not
    allow unauthenticated remote access. 
    -------------------------------------------------------------------------------
    17/04/2018 23:50:45 - Process(14900.9) User(SYSTEM) Program(amqrmppa.exe)
                          Host(APPLE) Installation(Installation1)
                          VRMF(8.0.0.5) QMgr(LocalQM)    AMQ9557: Queue Manager User ID initialization failed for 'mqclient'.    EXPLANATION:
    The call to initialize the User ID 'mqclient' failed with CompCode 2 and Reason
    2035.
    ACTION:
    Correct the error and try again. 
----- cmqxrsrv.c : 2356 -------------------------------------------------------

Установка сервера

Файл CCDT создается по следующим ссылкам:

Настройка сервера с помощью IBM MQ Explorer

Server-connection Channel: LOCAL.DEF.SVRCONNMCA User ID: empty

Настройка клиента с помощью IBM MQ Explorer

Clinet channe: LOCAL.DEF.SVRCONNQueue Manager name: LocalQMConnection name: 192.168.1.9(1415)

192.168.1.9 - это адрес локального хоста

1415 - диспетчер очереди, LocalQM TCP-порт.

СЕТЬ CCDT-среда

1

C:\Users\'#.lp\source>SET MQCHLLIB=C:\ProgramData\IBM\MQ\qmgrs\LocalQM\@ipccC:\Users\'#.lp\source>SET MQCHLTAB=AMQCLCHL.TAB
  1. Поместите AMQCLCHL.TAB также в C: \ ProgramData \ IBM \ MQ (я не знаю, почему это может быть неправильно, потому что ошибка в файле журнала:

    AMQ9518: Файл 'C: \ ProgramData \ IBM \ MQ \ AMQCLCHL.TAB не найден.

)

IBM MQ.NET

Код ниже из здесь

        MQQueueManager qm = null;
        System.Environment.SetEnvironmentVariable("MQCHLLIB", "C:\\ProgramData\\IBM\\MQ\\qmgrs\\LocalQM\\@ipcc");
        System.Environment.SetEnvironmentVariable("MQCHLTAB", "AMQCLCHL.TAB");        try
        {
            Hashtable props = new Hashtable();
            props.Add(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_CLIENT);
            qm = new MQQueueManager("LocalQM",props);
            MQQueue queue1 = qm.AccessQueue("LocalQueue", MQC.MQOO_OUTPUT | MQC.MQOO_FAIL_IF_QUIESCING);
            MQMessage msg = new MQMessage();
            msg.WriteUTF("Hello this message is from .net client");
            queue1.Put(msg);
            queue1.Close();
            qm.Disconnect();
        }
        catch (Exception ex)
        {
            Console.Write(ex);
        }

IBM MQ V8 в Windows 10

MQ .NET Client V8 в Windows 10

Создание таблицы определения канала клиента

Использование таблицы определения клиентского канала с .NET

Этот read относится к MQRC_Q_MGR_NAME_ERROR

Обновление 1

Следуя приведенной ниже ссылке. Но, похоже, информация о mqccred.ini не используется MQ Server. Потому что такая же ошибка возникает.

Выход безопасности на стороне клиента для вставки идентификатора пользователя и пароля (mqccred)

Шаги настройки:

1 Создайте mqccred.ini (D : \ mqccred.ini)

QueueManager:
    Name=LocalQM
    User=mqclient
    password=password

2 Задайте переменную среды Windows

set MQCCRED=D:\mqccred.ini

3 Используя mqccred

DEFINE CHANNEL(LOCAL.DEF.SVRCONN) CHLTYPE(clntconn) +
CONNAME(127.0.0.1) +
QMNAME(LocalQM) +
SCYEXIT('mqccred(ChlExit)') +
REPLACE

4 Установите ADOPTCTX (YES)

ALTER AUTHINFO(SYSTEM.DEFAULT.AUTHINFO.IDPWOS) AUTHTYPE(IDPWOS) ADOPTCTX(YES)

ОБНОВЛЕНИЕ 2

Я обновил объекты MQ до верхнего регистра и по-прежнему получают ту же ошибку, что и выше, но имеют следующее сообщение об ошибке:

Нужно ли мне писать программу выхода в .NET в соответствии с использованием выходных каналов в IBM MQ .NET?

22/04/2018 22:37:15 - Process(11904.1) User('#.lp) Program(mMq.Producer.exe)
                      Host(APPLE) Installation(Installation1)
                      VRMF(8.0.0.5)
AMQ9535: User exit not valid.EXPLANATION:
Channel program 'LOCAL.DEF.SVRCONN' ended because user exit 'mqccred(ChlExit)'
is not valid. 
Architecture of the exit library does not match the process's architecture
  which is '' bit.
ACTION:
Ensure that the user exit is specified correctly in the channel definition, and
that the user exit program is correct and available. 
----- IBM.WMQ.MQChannelExitHandler.LoadExit : 0 -------------------------------
22/04/2018 22:38:21 - Process(5720.1) User('#.lp) Program(mMq.Producer.exe)
                      Host(APPLE) Installation(Installation1)
                      VRMF(8.0.0.5)
AMQ9535: User exit not valid.EXPLANATION:
Channel program 'LOCAL.DEF.SVRCONN' ended because user exit 'mqccred(ChlExit)'
is not valid. 
Architecture of the exit library does not match the process's architecture
  which is '' bit.
ACTION:
Ensure that the user exit is specified correctly in the channel definition, and
that the user exit program is correct and available. 
----- IBM.WMQ.MQChannelExitHandler.LoadExit : 0 -------------------------------

ОБНОВЛЕНИЕ 3

У меня есть другая ошибка ниже, когда идентификатор пользователя MCA установлен на пользователя Windows.

IBM.WMQ.MQException: MQRC_Q_MGR_NOT_AVAILABLE22/04/2018 22:38:21 - Process(5720.1) User('#.lp) Program(mMq.Producer.exe)
                      Host(APPLE) Installation(Installation1)
                      VRMF(8.0.0.5)
AMQ9535: User exit not valid.EXPLANATION:
Channel program 'LOCAL.DEF.SVRCONN' ended because user exit 'mqccred(ChlExit)'
is not valid. 
Architecture of the exit library does not match the process's architecture
  which is '' bit.
ACTION:
Ensure that the user exit is specified correctly in the channel definition, and
that the user exit program is correct and available. 
----- IBM.WMQ.MQChannelExitHandler.LoadExit : 0 -------------------------------

Обновление 4

Извините за путаницу. Обновления 2 и 3 совпадают. Оба обновления должны иметь одинаковую ошибку: MQRC_Q_MGR_NOT_AVAILABLE, которая появляется после обновления 1. Я по ошибке MQRC_NOT_AUTHORIZED.

2 ответа

Zoe Roger ответил: 02 апреля 2018 в 02:36

Имя администратора очередей: LocalQM

Плохая идея. Вы стреляете себе в ногу. Используйте UPPERCASE для имени администратора очередей и имен объектов MQ. Если вы являетесь MQAdmin среднего или продвинутого уровня, вы можете попробовать использовать имена в смешанном регистре.

DEFINE CHANNEL (LOCAL.DEF.SVRCONN) CHLTYPE (clntconn) + CONNAME (127.0.0.1) + QMNAME (LocalQM) + SCYEXIT ('mqccred (ChlExit)') + REPLACE

1-й выпуск: если вы НЕ ставите кавычки вокруг имени объекта MQ, то MQ АВТОМАТИЧЕСКИ запишет его в верхнем регистре! Таким образом, MQ увидит вашу команду как для LOCALQM, а не как LocalQM.

Во-вторых, вы НЕ указали порт № для CONNAME. Поэтому MQ по умолчанию будет 1414. Но вы заявили, что используете порт # 1415.

И если вы не знаете, имена объектов MQ чувствительны к регистру.

Если я если бы вы, я бы удалил диспетчер очереди LocalQM и начал бы заново с LOCALQM и создал бы все объекты MQ с именами в верхнем регистре.

Использование CCDT не должно требовать учетных данных для входа, что является одной из целей использования CCDT .

Записи CCDT ТОЛЬКО содержат информацию о соединении. Они никогда не будут включать учетные данные пользователя / приложения. Чтобы указать учетные данные пользователя / приложения, вы указываете их в приложении или используете выход безопасности mqccred на стороне клиента.

В наше время каждый пользователь и каждое приложение должны указывать учетные данные пользователя, чтобы мы могли иметь безопасные среды MQ.


Обновление 23 апреля 2018 года

Архитектура библиотеки выхода не соответствует архитектуре процесса, которая является битовой. / p>

Под архитектурой понимается адресуемость вашей программы или работающая структура вашей программы. Это работает как 32-битная или 64-битная программа. Если он работает как 32-разрядная программа, вам необходимо использовать 32-разрядный файл mqccred.dll, а если он работает как 64-разрядная программа, то необходимо использовать 64-разрядный файл mqccred.dll.

Кажется, я кое-что помню о программах, управляемых в .NET (MQC.TRANSPORT_MQSERIES_MANAGED), которые не могут использовать встроенные программы выхода. Вам следует обратиться в службу поддержки IBM.

JoshMc ответил: 02 апреля 2018 в 02:57

Использование CCDT не устраняет необходимость подтверждения личности администратора очередей. Первая ошибка, которую вы представили, заключается в том, что по умолчанию MQ требует пароль для пользователей с правами администратора.

Существует четыре уровня CONNAUTH для клиентских подключений по сети:

  1. CHCKCLNT(REQDADM) это значение по умолчанию. Любой пользователь с полномочиями администратора MQ должен предоставить действительный пароль. Кроме того, любой пользователь без административных прав, который предоставляет пароль, должен предоставить действительный пароль.
  2. CHKCLNT(OPTIONAL) это аналогично # 1, но НЕ ТРЕБУЕТСЯ пароль для пользователей с правами администратора MQ. Любой пользователь Admin или не предоставивший пароль должен предоставить действительный пароль, с этим значением администраторский пользователь не должен будет отправлять пароль.
  3. CHCKCLNT(REQUIRED) это значение означает, что все пользователи должны предоставить действительный пароль.
  4. CHCKCLNT(NONE) пользователям не требуется вводить пароль, и даже если они предоставляют пароль, он не будет проверен.

Вы можете установить это значение для всего администратора очередей в объекте AUTHINFO, установленном как CONNAUTH значение в QMGR. Если вы установите для него значение REQADMIN или OPTIONAL, вы можете повысить его для определенных каналов с помощью правила CHLAUTH до более строгого значения, такого как REQUIRED. Вы не можете установить его ниже.

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

У вас есть несколько вариантов, которые нужно сохранить. защита включена:

  1. Можно использовать выход безопасности клиента, указанный в CLNTCONN, для передачи учетных данных, таких как mqcred.
  2. Можно использовать сертификат на стороне клиента с TLS и отобразить его на MCAUSER на SVRCONN.

Примечание, основанное на обновлении 1, которое вы указали QMNAME(LocalQM), потому что нет ни одного кавычки вокруг имени MQ сворачивают это в UPPERCASE и устанавливают это как LOCALQM.

Как отметил Роджер, вы также не указали порт 1415 в своем CONNAME. Вы указали, что у вас возникли проблемы с этим, и вам нужно заключать одинарные кавычки вокруг значения CONNAME, если в нем есть символы ( или ).


Примечание. на основе вашего ОБНОВЛЕНИЯ 2 (ниже собраны из комментариев, которые были перемещены в чат):

в каталоге установки MQ обычно в Program Files или Program Files(x86) вы должны найти подкаталог с именем Tools\c\Samples\mqccred, в нем должны быть подкаталоги для 32-битных (lib) и 64-битных (lib64). Вы должны скопировать файл из lib в каталог exits и из lib64 в каталог exits64.

Собственный выход .NET необходим только в том случае, если вы используете режим управляемого клиента .NET, который вы указываете, что не используете, имея props.Add(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_CLIENT);


UPDATE 2a на основе вашего комментария:

Извините, я использую MQC.TRANSPORT_MQSERIES_MANAGED. Я скопировал из другой ветки. Означает ли это, что мне нужно написать .NET exit?

mqcred не будет работать в управляемом режиме .NET, чтобы использовать выход для предоставления учетных данных, которые вам понадобятся для записи эквивалента в .net .

Было бы намного проще указать учетные данные в вашей программе через свойства, чем написать выход в управляемом режиме, аналогичный mqcred.

Роджер ответил на" Отправка сообщения в IBM MQ: зависает на AccessQueue " представляет собой превосходный пример, демонстрирующий передачу имени пользователя и пароля в управляемом режиме. Вы все еще можете получить информацию о соединении из CCDT.

        if (inParms.ContainsKey("-u"))
           qMgrProp.Add(MQC.USER_ID_PROPERTY, ((System.String)inParms["-u"]));        if (inParms.ContainsKey("-x"))
           qMgrProp.Add(MQC.PASSWORD_PROPERTY, ((System.String)inParms["-x"]));        if ( (inParms.ContainsKey("-u")) && (inParms.ContainsKey("-x")) )
           qMgrProp.Add(MQC.USE_MQCSP_AUTHENTICATION_PROPERTY, true);
Pingpong ответил: 29 марта 2018 в 09:37
Я исправил случаи и 1415 проблем, я думаю, прежде чем я добавлю обновление 2
JoshMc ответил: 31 мая 2018 в 09:02
@Pingpong Могу ли я предоставить вам дополнительную информацию, чтобы помочь ответить на ваш вопрос? Я думаю из того, что вы спросили, я дал ответ. Тот факт, что то, что вы хотите сделать (используйте CCDT только для предоставления имени пользователя и пароля от управляемого клиента .NET), невозможно без написания собственного выхода .NET, не означает, что этот ответ неверен.