身份验证错误将消息发送到AWS上的Windows Service Bus 1.0

时间:2013-07-12 00:34:51

标签: amazon-web-services servicebus

我正在尝试从本地工作组计算机(Windows 7)发送和接收消息,将其称为“客户端”,以及在工作组服务器上设置的Service Bus 1.0(在AWS EC2上托管)。经过多次试验和研究后,我无法从客户端计算机向服务器发送消息。我已经关注了一些似乎表明可以做的文章,但我无法解决我看到的身份验证问题。

Connecting to Windows Server Service Bus on AWS

Microsoft Service Bus on a Windows Workgroup

我注意到Microsoft系统要求似乎表明它“不受支持”和“不可能”。我的问题是,这可以做到,有人有成功吗?任何帮助将不胜感激。

msdn.microsoft.com/en-us/library/windowsazure/jj193011(V = azure.10)的.aspx

我的尝试包括使用WindowsTokenProvider和OAuthTokenProvider。我得到了同样的结果:

System.UnauthorizedAccessException:令牌提供程序在访问“https://xx.xx.xx.xx:9355/ServiceBusDefaultNamespace/ $ STS / Windows /”时无法提供安全令牌。令牌提供程序返回消息:''。 ---> System.IdentityModel.Tokens.SecurityTokenException:令牌提供程序在访问“https://xx.xx.xx.xx:9355/ServiceBusDefaultNamespace/ $ STS / Windows /”时无法提供安全令牌。令牌提供程序返回消息:''。 ---> System.Net.WebException:远程服务器返回错误:(401)Unauthorized。

Service Bus命名空间使用AddressingScheme“Path”进行工作组安装。客户端连接字符串包含到达服务器的IP,我在创建队列之前设置了RemoteCertificateValidationCallback。

Endpoint=sb://xx.xx.xx.xx/ServiceBusDefaultNamespace;StsEndpoint=https://xx.xx.xx.xx:9355/ServiceBusDefaultNamespace;RuntimePort=9354;ManagementPort=9355;WindowsUsername=SBUser;WindowsDomain=[NotUsed];WindowsPassword=[Password]

附加到远程队列并发送消息的代码如下:

ServiceBusConnectionStringBuilder connBuilder = new ServiceBusConnectionStringBuilder(ConfigurationManager.AppSettings["Microsoft.ServiceBus.ConnectionString"]); // Gets the connection string above
TokenProvider tokenProvider = WindowsTokenProvider.CreateWindowsTokenProvider(connBuilder.StsEndpoints, new NetworkCredential(connBuilder.WindowsCredentialUsername, connBuilder.WindowsCredentialPassword));
MessagingFactorySettings messagingFactorySettings = new MessagingFactorySettings();
messagingFactorySettings.TokenProvider = tokenProvider;
MessagingFactory messagingFactory = MessagingFactory.Create(connBuilder.GetAbsoluteRuntimeEndpoints(), messagingFactorySettings);
requestQueue = messagingFactory.CreateQueueClient("RequestQueue");
...
requestQueue.Send(sendMessage);  // Fails here

服务器帐户是带有密码的SBUser,我在令牌提供程序中将域/主机指定为空。我注意到服务器上的事件查看器显示正在尝试的身份验证是客户端的用户帐户,而不是令牌提供程序中的用户帐户。为什么是这样?我显然错过了一些东西,以便在服务器上进行身份验证。

An account failed to log on.

Subject:
  Security ID: NULL SID
  Account Name: -
  Account Domain: -
  Logon ID: 0x0

Logon Type: 3

Account For Which Logon Failed:
  Security ID: NULL SID
  Account Name: [ClientLogin]
  Account Domain: [ClientMahcine]

Failure Information:
  Failure Reason: Unknown user name or bad password.
  Status: 0xc000006d
  Sub Status: 0xc0000064

感谢任何帮助。感谢。

3 个答案:

答案 0 :(得分:1)

尝试使用OAuthTokenProvider并确保connBuilder传递正确的值。

TokenProvider tokenProvider = TokenProvider.CreateOAuthTokenProvider(connBuilder.StsEndpoints,new NetworkCredential(connBuilder.WindowsCredentialUsername,connBuilder.WindowsCredentialPassword));

尝试此操作后,请回复您在客户端获得的例外情况。此外,在服务器中,搜索“服务总线”部分中的事件,该事件将提供有关该例外的更多详细信息。

有了这些信息,我们应该继续下一步。

答案 1 :(得分:0)

你到底了吗?

我设法通过在客户端计算机主机文件中设置证书绑定到的服务器的完全限定域名来解决完全相同的问题。

因此,如果您在连接字符串中输入了IP地址,则应输入“AMAZONA-PQxxxxx”。在您的主机文件中,将“AMAZONA-PQxxxxx”解析为IP地址。

答案 2 :(得分:0)

我们遇到了同样的问题。服务器W2k12R2,独立,工作组;客户端Windows 7,相同的工作组。

在两个系统上拥有相同的用户帐户是必要的。看起来这是某种"身份验证代理的东西"运行

看看上面提到的兼容性矩阵: http://msdn.microsoft.com/en-us/library/windowsazure/jj193011(v=azure.10).aspx

谢谢,

霍尔格