WebSphere MQ C API使用客户端连接发送客户端ID

时间:2015-01-15 13:59:15

标签: ibm-mq

您好我使用CSP结构在客户端应用程序上发送客户端ID,我的目标是根据此ID获取OAM授权的队列操作,而不是我的应用程序的进程ID跑下。我观察到的是:

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

    除了使用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指定连接工厂。

1 个答案:

答案 0 :(得分:2)

您在队列管理器方面对MQCSP实际执行任何操作有什么作用?由于您只是V7.5,因此队列管理器没有内置(在V8中),因此如果您没有安全性退出,则会忽略MQCSP。

实际上'忽略'不太准确,我认为内置行为检查MQCSP用户和run-as用户ID是否相同。但除非您有安全出口或使用MQ V8,否则不会检查密码。

OP提供的更多信息

在这方面,'p'客户端与Java客户端的工作方式不同。 Java客户端使用MQEnvironment集用户标识作为运行用户标识。从Java无法获取客户端进程ID的历史异常。

我认为你有三个选择: -

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