我们有一个通用的dll(API),负责在单独的Web应用程序上托管无文件.svc服务。所以我们的API由不同的Web应用程序引用。作为服务端点,我们使用BasicHttpBinding,作为安全模式,我们在API上使用“BasicHttpSecurityMode.None”。
如果IIS上的Web应用程序启用了“匿名身份验证”,我们的无文件* .svc已成功托管,我们可以从浏览器调用它并查看元数据。
另一方面,如果IIS上的Web应用程序“匿名身份验证”已禁用且“Windows身份验证”已启用 ,则会收到错误消息:
“主机上配置的身份验证方案('IntegratedWindowsAuthentication')不允许在绑定'MyService'('Anonymous')上配置的身份验证方案。请确保将SecurityMode设置为Transport或TransportCredentialOnly。此外,这可能是通过IIS管理工具,通过ServiceHost.Authentication.AuthenticationSchemes属性,在元素的应用程序配置文件中,通过更新绑定上的ClientCredentialType属性,或通过调整AuthenticationScheme属性来解决此应用程序的身份验证方案HttpTransportBindingElement“。
我想出了如何使用下面给出的代码解决问题。但是,我需要知道IIS上的Web应用程序的身份验证状态。我没有找到以编程方式来确定当前Web应用程序的身份验证状态。也许在Web应用程序的web.config中,我们可以手动设置指定的身份验证状态。
web.config设置
<appSettings>
<add key="IS_ANONYMOUS" value="True"/>
</appSettings>
这里是用于创建Binding的代码块:
public BasicHttpBinding GetBasicHttpBinding( string bindingName, bool isAnonymous ) {
BasicHttpBinding binding = new BasicHttpBinding();
binding.Security.Mode = BasicHttpSecurityMode.None;
if (!isAnonymous) {
binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Ntlm;
binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None;
binding.Security.Transport.Realm = "";
binding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName;
binding.Security.Message.AlgorithmSuite = SecurityAlgorithmSuite.Default;
}
binding.Name = bindingName;
binding.MaxReceivedMessageSize = int.MaxValue;
binding.ReaderQuotas.MaxStringContentLength = int.MaxValue;
return binding;
}
我们如何托管服务:
internal static ServiceHost CreateServiceHost( Type implementedContractType, Type serviceType, Uri[] baseAddresses ) {
ServiceHost host = new ServiceHost( serviceType, baseAddresses );
BasicHttpBinding binding = GetBasicHttpBinding( serviceType.Name, false );
host.AddServiceEndpoint( implementedContractType, binding, "" );
return host;
}
我的问题是如何创建服务主机不受Web应用程序的身份验证状态的影响。有没有办法创建无文件.svc文件而不了解Web应用程序的身份验证状态,可以匿名访问?