1

我们有一个通用的 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 属性或通过调整 HttpTransportBindingElement 上的 AuthenticationScheme 属性。

我想出了如何使用下面给出的代码解决问题。但是我需要知道 IIS 上 Web 应用程序的身份验证状态。我没有找到编程方式来确定当前 Web 应用程序的身份验证状态是什么。也许在 web 应用程序的 web.config 中我们可以手动设置指定的身份验证状态。

web.config 设置

<appSettings>
     <add key="IS_ANONYMOUS" value="True"/>
</appSettings>

这里是创建绑定的代码块:

     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 应用程序身份验证状态影响的服务主机。有没有办法在不知道 Web 应用程序的身份验证状态的情况下创建无文件 .svc 文件并且可以匿名访问?

4

0 回答 0