我遇到了Windows Azure ACS的问题,我无法确定它是否应该是这样,或者我的代码中是否有错误。
我在ACS中配置了许多依赖方,并且所有依赖方都配置了HTTPS。每个服务都以需要令牌加密的方式配置。为此,我上传了使用MakeCert.exe创建的证书。
当客户端与依赖方通信时,我将证书的公共部分添加为服务证书,并将主题名称添加为DnsIdentity:
var identity = EndpointIdentity.CreateDnsIdentity( GetClientCertificateSubjectName() );
var serviceEndpointAddress = new EndpointAddress( new Uri( _serviceAddress ), identity );
// Creation of channel factory
if( channelFactory.Credentials != null ) {
channelFactory.Credentials.ServiceCertificate.DefaultCertificate = GetClientCertificate();
channelFactory.Credentials.ClientCertificate.Certificate = GetServiceIdentityCertificate();
}
事情就是这样:当我通过HTTPS呼叫依赖方时,我可以跳过EndpointIdentity
的创建,然后依赖方会给我一个正确的答案。我也可以跳过设置ServiceCertificate.DefaultCertificate
属性或设置一个完全随机的证书,依赖方仍然会给我一个正确的答案。
当通过HTTP调用时,执行上述任何操作都会导致ACS错误输出,并显示消息表明我没有使用正确的证书。简而言之:当通过HTTP调用时,我只能与正确的客户端证书进行通信。我预计这也是HTTPS的情况。
我可以想象ChannelFactory<T>
或ACS足够聪明,可以检测到使用了HTTPS并且跳过了配置的加密,有利于SSL加密。可悲的是,我无法找到任何支持这一想法的文档。
我的问题是:通过HTTPS呼叫依赖方时忽略EndpointIdentity
和证书是否正常?或者我是否需要其他配置才能使其正常工作?
提前致谢!
答案 0 :(得分:0)
我提供的信息量不足以正确回答问题。事实证明,这一切都在我们正在创建的绑定中。它使用以下代码创建绑定:
public static Binding CreateServiceBinding( string acsCertificateEndpoint, string bindingNameSpace, bool useSsl ) {
var binding = new IssuedTokenWSTrustBinding( CreateAcsCertificateBinding(), new EndpointAddress( acsCertificateEndpoint ) );
if( useSsl ) {
binding.SecurityMode = SecurityMode.TransportWithMessageCredential;
}
if( !string.IsNullOrWhiteSpace( bindingNameSpace ) ) {
binding.Namespace = bindingNameSpace;
}
return binding;
}
public static CertificateWSTrustBinding CreateAcsCertificateBinding() {
return new CertificateWSTrustBinding( SecurityMode.TransportWithMessageCredential );
}
结果如下:
有关安全模式的更多信息,请查看以下链接:
https://msdn.microsoft.com/en-us/library/ms733098%28v=vs.110%29.aspx https://msdn.microsoft.com/en-us/library/ms731074%28v=vs.110%29.aspx
希望这有助于某人!