这个问题有类似的问题,但不完全相同......
我有一个使用amqmdnet.dll的C#程序(来自9.0.1.0 MQC Redist) 要连接的代码是:
Hashtable mqProperties = new Hashtable();
mqProperties.Add(MQC.CHANNEL_PROPERTY, channelName);
mqProperties.Add(MQC.HOST_NAME_PROPERTY, hostname);
mqProperties.Add(MQC.PORT_PROPERTY, port);
queueManager = new MQQueueManager(strQueueManagerName, mqProperties);
它工作正常并写入队列。我假设它从Windows中获取我当前的登录ID。
当我在IIS上运行相同的代码时,它会连接但在尝试写入Queue时失败并出现auth错误2035.我认为这是因为IIS作为不同的用户ID运行。
我尝试添加:
mqProperties.Add(MQC.USER_ID_PROPERTY, "myuserid");
mqProperties.Add(MQC.PASSWORD_PROPERTY, "mypassword");
它不起作用。尝试“mydomain \ myuserid”也不起作用。其他一些帖子提到MQ需要Windows SID。我尝试使用该字符串,但这也不起作用。
此时,我正在玩这个,所以我不想让管理员在MQ服务器端设置新的用户ID。考虑到这一点,有什么方法可以在IIS用户下运行时登录,但是传入我的用户名/密码或其他一些凭证来使其工作?
答案 0 :(得分:1)
如果队列管理器是v8.0或更高版本并且配置为使用CONNAUTH并且设置了ADOPTCTX(YES),则可以显示id和密码。如果它没有此设置,则将忽略.NET客户端的UserId和Password属性中显示的值。
IBM developerWorks MQdev博客文章“MQCSP Password Protection in MQ V8详细介绍了如何使用各种语言执行此操作。”
对于.NET,您应该能够使用MQC.USE_MQCSP_AUTHENTICATION_PROPERTY
设置为true
时所拥有的内容:
mqProperties.Add(MQC.USER_ID_PROPERTY, "myuserid");
mqProperties.Add(MQC.PASSWORD_PROPERTY, "mypassword");
mqProperties.Add(MQC.USE_MQCSP_AUTHENTICATION_PROPERTY, true);
然后,队列管理器将验证此ID。如果使用ADOPTCTX(YES)设置队列管理器,则它将始终使用经过身份验证的ID进行OAM检查。如果设置为ADOPTCTX(NO),它仍将使用正在运行进程的ID来执行OAM检查。强烈建议将其设置为ADOPTCTX(是)。
更新2017/02/20 :
与评论相关“我可以看到它可能被管理员关闭,因此MQ依赖于更大的组织SSO基础架构。”如果不设置CONNAUTH和ADOPTCTX(YES),您可以通过频道断言任何 ID。如果没有CHLAUTH规则来阻止管理用户,那么您可以获得完整的MQ管理权限,而无需任何形式的身份验证。