为远程 IIS 应用程序池标识配置 MSMQ 私有队列权限

3

我的设置

  1. ServerA在本地使用IIS应用程序池标识运行Web应用程序。

  2. ServerB正在运行MSMQ,托管一个我们称之为MyQueue的私有队列

  3. 使用ServerB上的消息队列管理器,我已将MyQueue配置为向ServerA的域帐户(ServerA $)以及ANONYMOUS LOGON用户授予完全控制权限

我想发生的事情

我希望ServerA上的Web应用程序将消息发送到ServerB上的MyQueue

实际发生的事情

消息从未出现在ServerB上,我也没有收到任何错误消息。 我已经打开了负源日志记录,并且可以看到我在死信队列中收到“访问被拒绝”的错误。

如果我授予Everyone完全控制权限,则消息会显示,但我不想这样做。

我为什么认为这会起作用

关于IIS应用程序池标识的这篇文章说道:

在域环境中使用Network Service帐户有很大的好处。 作为Network Service运行的工作进程将以机器帐户的身份访问网络。 当计算机加入域时,将生成机器帐户。 它们看起来像这样:

domainname\machinename$,

例如:

mydomain\machine1$ 这个好处是,可以对像文件共享或SQL Server数据库这样的网络资源进行ACL控制,以允许此机器帐户访问。

应用程序池标识怎么样?

好消息是应用程序池标识也使用机器帐户来访问网络资源。 不需要进行更改。

基于那些信息,我会认为在MyQueue上授予MY_DOMAIN \ SERVERA $权限,然后事情应该能够正常工作。 但是它们没有。

有什么想法我做错了什么吗?


如果你添加了 "Everyone" 权限并且它工作正常,那么这意味着访问队列的帐户是已知的。也就是说,该帐户是本地计算机或域安全数据库的成员。匿名登录不起作用,因为它将用于未知帐户(例如使用本地计算机帐户访问远程队列)。 - John Breakwell
你需要添加IIS账户而不是计算机登录的域账户。不确定你使用的是哪个版本的IIS,因此请阅读此链接以了解账户的清晰度。http://www.iis.net/learn/get-started/planning-for-security/understanding-built-in-user-and-group-accounts-in-iis - Sorceri
只是想说我没有忘记你和John以及Sorcrei给的建议。我正在尝试在相关服务器上启用审计,以便我可以看到到底是哪个用户被拒绝访问队列。这需要我们的系统管理员小组,所以我正在等待他们为我设置。等我有更多信息或希望有解决方案时,我会再次查看并回复你们的。 :) - JamieGaines
@JamieGaines 这个有更新了吗? - Louis Haußknecht
我们遇到了同样的问题,想知道你是否已经找到了解决方法? - EdSalter
2个回答

3
这个问题已经有段时间了,但是我成功地使用ApplicationPoolIdentity用户从IIS应用程序查询了MSMQ:
  1. 在IIS管理控制台的应用程序池列表中查找所需应用程序的应用程序池名称
  2. Server Manager > 属性 > 安全性中右键单击MSMQ队列
  3. 点击添加
  4. 输入对象名称IIS APPPOOL\{来自第1步的应用程序池名称}。这应该会自动完成为应用程序池名称
  5. 授予所需的权限-通常是Peek Message和/或Receive Message
最好避免向Everyone授予权限。
参考资料:https://serverfault.com/a/81246/24816

0

我刚刚偶然发现这个问题,并在我的案例中找到了解决方案,如果我将IIS设置为以网络服务账户运行,则远程队列将收到我发送的消息。

这在今天占用了我很多时间,现在我需要弄清楚将IIS作为网络服务运行是否真的可以,并且不会破坏其他任何东西。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接