如何在 C 客户端中使用 MQCSP 中的 userId 进行 IBM MQ 连接身份验证

How to use the userId in MQCSP for IBM MQ connection authentication in C client

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

        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");

然后调用 MQCONNX() 连接 MQ 服务器,运行 客户端与用户 "user1",但服务器始终验证 运行 正在应用程序 "user1".

我将 MQ 服务器设置如下:

ALTER QMGR CONNAUTH(SYSTEM.DEFAULT.AUTHINFO.IDPWOS)
DEFINE AUTHINFO(SYSTEM.DEFAULT.AUTHINFO.IDPWOS) +
    AUTHTYPE(IDPWOS) +
    FAILDLAY(10) +
    CHCKLOCL(OPTIONAL) +
    CHCKCLNT(REQUIRED) +
    ADOPTCTX(YES) 
REFRESH SECURITY TYPE(CONNAUTH)

define qlocal(HDPARLOCALQUEUE01) replace

define channel(HDPARCHANNEL) +
   chltype(SVRCONN) +
   trptype(TCP) +
   MCAUSER(' ')
alter channel(HDPARCHANNEL) +
  chltype(SVRCONN) +
  MCAUSER(' ')
ALTER QMGR CHLAUTH(DISABLED)

如何让 MQ 服务器验证 MQCSP 中提供的用户?

我在qm.ini

中添加了"ChlauthEarlyAdopt=Y"

此致,

为了让 IBM MQ queue 管理器使用您在 MQCSP 结构中传递的 ID 进行授权,您需要 QMGR CONNAUTHAUTHINFO object 配置为 ADOPTCTX(YES)。在您的示例中,您尝试这样做,但它会失败,因为 object SYSTEM.DEFAULT.AUTHINFO.IDPWOS 默认存在。


如果您想更新现有的 object,您不能使用 DEFINE 来更改它,除非您将其与 REPLACE 关键字一起使用,或者您可以使用 ALTER命令来完成这个。


我还建议使用您想要的参数定义您自己的 AUTHINFO object,这将防止将来的升级覆盖任何 non-default 设置。

例如:

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,通常默认的 CHLAUTH 规则不会造成任何问题,只会阻止两件事:

  1. 您无法连接到任何以 SYSTEM 开头的频道,您没有这样做。

  2. 您不能以 mqm 等 MQ 管理员用户或同等用户的身份进行连接。我看到你的示例显示 user2,如果这是 mqm 组中的用户,那么你将被阻止。

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