我有一个独立的内部部署Service Fabric Cluster,使用Windows身份验证进行保护。
在这个应用程序中,我有一个ASP.NET Core WebApi无状态服务,它尝试通过远程处理与另一个无状态服务进行通信。不幸的是,当WebApi服务尝试RPC到无状态服务时,我收到以下错误:
System.AggregateException: One or more errors occurred. ---> System.Fabric.FabricConnectionDeniedException: Not authorized to connect ---> System.Runtime.InteropServices.COMException: Exception from HRESULT: 0x80071C43
at Microsoft.ServiceFabric.FabricTransport.NativeServiceCommunication.IFabricServiceCommunicationClient2.EndRequest(IFabricAsyncOperationContext context)
at Microsoft.ServiceFabric.FabricTransport.Client.FabricTransportClient.EndRequest(IFabricAsyncOperationContext context)
at System.Fabric.Interop.AsyncCallOutAdapter2`1.Finish(IFabricAsyncOperationContext context, Boolean expectedCompletedSynchronously)
--- End of inner exception stack trace --
此外,我可以确认
将同一个应用程序部署到“开发集群”(即我的本地计算机或另一个在一台计算机上运行其所有节点的远程服务结构集群)时,我没有收到错误 - 因此可能是用于设置我的多机群集的AD帐户的问题(我使用的是machine group account)。
创建客户端代理时,我确实设置了安全凭证以使用Windows身份验证 - 即
var transportSettings = new FabricTransportRemotingSettings
{
SecurityCredentials = new WindowsCredentials()
};
Func<IServiceRemotingCallbackClient, IServiceRemotingClientFactory> clientProxyFactory = c => new FabricTransportServiceRemotingClientFactory(transportSettings);
var serviceProxyFactory = new ServiceProxyFactory(clientProxyFactory);
TService clientProxy = serviceProxyFactory.CreateServiceProxy<TService>(uri);
return clientProxy;
在上面的代码中,如果我改为使用:
SecurityCredentials = new NoneSecurityCredentials()
然后我得到了一个类似的FabricConnectionDeniedException
但是消息略有不同,说Client is not authorised to connect
。这是有道理的 - 但同样可能表明我的传输设置存在问题......