在完全Windows身份验证的站点和完全匿名的站点上托管无文件.svc服务

时间:2013-02-19 12:09:28

标签: wcf authentication anonymous basichttpbinding svc

我们有一个通用的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应用程序的身份验证状态,可以匿名访问?

0 个答案:

没有答案