如何在MQCSP中使用userId在C客户端中进行IBM MQ连接认证

时间:2019-02-02 03:25:42

标签: authentication ibm-mq

我有一个C客户端来连接到IBM MQ,并在MQCSP中填写用户ID和密码,如下所示:

void taxPrint(std::vector<TaxPayer> &citizen)
{
    int loops = 0;

    std::cout << "\nTaxes due for this year: \n" << std::endl;

    do
    {
        std::cout << "Tax Payer #" << loops << " : $" << std::setprecision(2) 
                  << std::fixed << citizen[loops].taxes / 100. << std::endl;
        loops++;
    }
    while (loops + 1 <= SIZE);
} // Don't miss this bracket!

然后调用MQCONNX()连接MQ服务器,使用用户“ user1”运行客户端,但是服务器始终对运行应用程序“ user1”的用户进行身份验证。

我将MQ服务器设置如下:

        MQCNO Connect_options = {MQCNO_DEFAULT};
        MQCSP   csp = {MQCSP_DEFAULT};
        Connect_options.SecurityParmsPtr = &csp;
        Connect_options.Version = MQCNO_VERSION_5;

        csp.AuthenticationType = MQCSP_AUTH_USER_ID_AND_PWD;
        csp.CSPUserIdPtr = "user2";
        csp.CSPUserIdLength = strlen("user2");
        csp.CSPPasswordPtr = "password";
        csp.CSPPasswordLength = strlen((char*)"password");

我如何让MQ服务器对MQCSP中提供的用户进行身份验证?

我在qm.ini中添加了“ ChlauthEarlyAdopt = Y”

此致

1 个答案:

答案 0 :(得分:1)

为了为IBM MQ队列管理器以使用在所述MQCSP结构用于授权目的通过ID你需要有QMGR CONNAUTH的{​​{1}}与被配置对象AUTHINFO。在您的示例中,您尝试执行此操作,但是由于对象ADOPTCTX(YES)默认存在,因此将失败。


如果要更新现有对象,则除非使用SYSTEM.DEFAULT.AUTHINFO.IDPWOS关键字,否则不能使用DEFINE对其进行更改,或者可以使用REPLACE命令来完成此操作


我也建议定义自己的ALTER对象与你想要的,这将防止未来的升级,从覆盖任何非默认设置的参数。

例如:

AUTHINFO

我也看到你禁用DEFINE AUTHINFO(MY.AUTHINFO.IDPWOS) AUTHTYPE(IDPWOS) CHCKLOCL(OPTIONAL) CHCKCLNT(REQUIRED) ADOPTCTX(YES) LIKE(SYSTEM.DEFAULT.AUTHINFO.IDPWOS) ALTER QMGR CONNAUTH(MY.AUTHINFO.IDPWOS) REFRESH SECURITY TYPE(CONNAUTH) ,通常默认的CHLAUTH规则是不会引起任何问题,只会阻止两件事情:

  1. 您无法连接到以CHLAUTH开头的任何频道,而您没有这样做。
  2. 可以不作为MQ管理员用户连接诸如SYSTEM,或等同物。我看到您的示例显示了mqm,如果这是user2组中的用户,那么您将被屏蔽。

    @MoragHughson写了一个不错的IBM developerWorks MQdev博客,标题为“ Getting going without turning off MQ Security”,它解释了如何保持此安全性,这将是一个很好的起点。