Ibm mq WebSphere MQ C API通过客户端连接发送客户端ID

Ibm mq WebSphere MQ C API通过客户端连接发送客户端ID,ibm-mq,Ibm Mq,您好,我正在使用CSP结构在客户端应用程序上发送客户端ID,我的目标是让OAM基于此ID而不是我的应用程序正在运行的进程的ID来授权队列操作。我观察到的是: 如果我的进程以alice的身份运行,并且我在MQCSP中发送bob,那么在MQCONNX调用中会得到2035 如果我在本地计算机上创建了一个用户alice,并以alice在MQSCSP中发送alice的身份执行该程序,则调用成功 如果我以alice的身份运行程序,但在MQCSP中发送bob,MQCONNX将失败,原因码为2035 显然,为什

您好,我正在使用CSP结构在客户端应用程序上发送客户端ID,我的目标是让OAM基于此ID而不是我的应用程序正在运行的进程的ID来授权队列操作。我观察到的是:

  • 如果我的进程以alice的身份运行,并且我在MQCSP中发送bob,那么在MQCONNX调用中会得到2035
  • 如果我在本地计算机上创建了一个用户alice,并以alice在MQSCSP中发送alice的身份执行该程序,则调用成功
  • 如果我以alice的身份运行程序,但在MQCSP中发送bob,MQCONNX将失败,原因码为2035
  • 显然,为什么在第3种情况下,用于授权的ID似乎是在MQSCP字段中发送的ID,而在第1种情况下则不是

    除了使用MQSCP结构中的字段发送MQCONNX调用的options参数中的CLNTID外,还需要设置什么

    该环境是在Linux上运行的WMQ 7.5

    代码是:

        MQCNO mqcno = {MQCNO_DEFAULT};
        mqcno.Version = MQCNO_VERSION_5;
       // Identification
        if (mqpar->user != NULL) {
                MQCSP sp = {MQCSP_DEFAULT};
                sp.Version = MQCSP_CURRENT_VERSION;
                sp.AuthenticationType = MQCSP_AUTH_USER_ID_AND_PWD;
                sp.CSPUserIdPtr = mqpar->user;
                sp.CSPUserIdLength = strlen(mqpar->user);
                sp.CSPPasswordPtr = mqpar->pwd;
                sp.CSPPasswordLength = strlen(mqpar->pwd);
    
                mqcno.SecurityParmsPtr = &sp;
        }
    
    
        MQCONNX("",&mqcno,mgrd,retc,reasc);
    
    谢谢你的帮助

    从OP后续评论中添加额外信息。

    编写此代码的目的不是对连接进行身份验证,而是获取OAM所做的授权检查,该检查基于MQCSP中发送的用户,而不是客户端上运行的进程所使用的用户ID


    我试图达到在Java WebSphere Application Server中配置连接工厂的效果,如果我没有弄错,请根据为连接工厂指定的身份验证别名将连接上的用户ID传输到管理器。

    在队列管理器端,您有什么东西可以实际使用MQCSP执行任何操作?由于您仅处于V7.5版本,队列管理器没有内置它(即在V8中),因此如果您没有安全出口,您的MQCSP将被忽略

    实际上,“忽略”并不十分准确,我认为内置的行为检查MQCSP用户和运行方式用户ID是否相同。但除非您有安全出口或使用MQ V8,否则不会检查密码

    由于OP提供了更多信息

    在这方面,“C”客户端与Java客户端的工作方式不同。Java客户端使用MQEnvironment set user ID作为运行方式用户ID。这是Java无法获取客户端进程ID时出现的历史异常

    我想你有三个选择:-

    • 将MQ V8与ADOPTCTX一起使用(是)
    • 使用CHLAUTH规则根据客户端IP地址和/或以用户身份运行来设置服务器端
      MCAUSER
    • 编写一个小型安全出口,将MQCSP用户ID复制到
      MCAUSER

    我的目的不是验证连接,我想要实现的是,OAM进行的授权检查基于MQCSP中发送的用户,而不是您所说的运行方式用户ID,我认为这是客户端正在运行的进程的用户ID。我试图实现在Java WebSphere Application Server中配置连接工厂的相同效果,即如果我没有弄错,则根据为连接工厂指定的身份验证别名将连接上的用户ID传输到管理器。更新的问题和答案