Tengo una muy simple WCF webservice que un cliente que se aloja en su propio IIS.

El cliente tiene su propio cliente que han sido las pruebas en su contra, en su entorno de pruebas, y todo estaba funcionando bien, hasta que se desactiva la autenticación anónima y habilitado básica. Una vez que lo hicieron, comenzaron a llegar los errores:

The authentication schemes configured on the host ('Basic') do not allow those configured on the binding 'BasicHttpBinding' ('Anonymous'). Please ensure that the SecurityMode is set to Transport or TransportCredentialOnly. 

Así que, ¿qué tengo que hacer para obtener la autenticación básica de trabajo?

Mi webservice actual web.config:

<configuration>
    <system.web>
        <compilation debug="true" targetFramework="4.5" />
        <httpRuntime targetFramework="4.5" />
    </system.web>
    <system.serviceModel>
        <behaviors>
            <serviceBehaviors>
                <behavior name="">
                    <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
                    <serviceDebug includeExceptionDetailInFaults="false" />
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
            multipleSiteBindingsEnabled="true" />
    </system.serviceModel>
</configuration>

Tengo mi propio cliente de prueba, que puedo ejecutar en contra de mi webservice. Su actual app.config:

<configuration>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IMyServiceSvc" />
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost/MyServiceSvc.svc"
                binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IMyServiceSvc"
                contract="MyServiceSvc.IMyServiceSvc"
                name="BasicHttpBinding_IMyServiceSvc" />
        </client>
    </system.serviceModel>
</configuration>

Cuando puedo instalar el servicio en mi local de IIS, y ejecutar el cliente en su contra, todo funciona, con la autenticación anónima habilitada.

¿Qué tengo que hacer para activar la autenticación básica, autenticación en IIS, y para configurar el cliente y el servidor para utilizar la autenticación básica?

Mi prueba actual código de cliente:

public class BlackHillsCompletionSvcTest
{
    static void Main(string[] args)
    {
        using (var client = new MyServiceSvcClient())
        {
            var data = new Data
            {
                id = "1",
                description = "test data"
            };

            try
            {
                var result = client.receiveData(data);
            }
            catch (Exception ex)
            {
                var msg = ex.Message;
            }
        }
    }
}

==Intentos:==

Como por Pankaj Kapare la sugerencia, he añadido esto al webservice del web.config:

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="httpBinding">
                <security mode="TransportCredentialOnly">
                    <transport clientCredentialType="Basic" />
                </security>
            </binding>
        </basicHttpBinding>
    </bindings>
    ...
</system.serviceModel>

Con eso, tengo un error al crear el cliente:

The binding at system.serviceModel/bindings/basicHttpBinding does not have a configured binding named 'BasicHttpBinding_IMyServiceSvc'. This is an invalid value for bindingConfiguration. 

Así que he añadido esto al cliente del app.config:

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpBinding_IMyServiceSvc">
                <security mode="TransportCredentialOnly">
                    <transport clientCredentialType="Basic" />
                </security>
            </binding>
        </basicHttpBinding>
    </bindings>
    ...
</system.serviceModel>

Con eso, tengo otro error:

The username is not provided. Specify username in ClientCredentials.

Así que he añadido un nombre de usuario y contraseña en mi cliente:

using (var client = new MyServiceSvcClient())
{
    client.ClientCredentials.UserName.UserName = "myusername";
    client.ClientCredentials.UserName.Password = "mypassword";
    ...
}

Y con eso, me sale otro error:

The requested service, 'http://localhost/MyServiceSvc.svc' could not be activated.  Which got me wondering. So I loaded the .svc page in my browser, was asked to log in, and after I did, I saw this:

The authentication schemes configured on the host ('Basic') do not allow those configured on the binding 'BasicHttpBinding' ('Anonymous').  Please ensure that the SecurityMode is set to Transport or TransportCredentialOnly.  Additionally, this may be resolved by changing the authentication schemes for this application through the IIS management tool, through the ServiceHost.Authentication.AuthenticationSchemes property, in the application configuration file at the <serviceAuthenticationManager> element, by updating the ClientCredentialType property on the binding, or by adjusting the AuthenticationScheme property on the HttpTransportBindingElement.

Que es lo que el cliente está viendo.

Ideas?

== Tal vez una solución? ==

Creo que lo que podría haber sido faltaba era una definición de servicio, en el servidor, la vinculación de la unión a la estación:

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="httpBinding">
                <security mode="TransportCredentialOnly">
                    <transport clientCredentialType="Basic" />
                </security>
            </binding>
        </basicHttpBinding>
    </bindings>
    <services>
        <service
                name="MyServiceSvcNs.MyServiceSvc"
                behaviorConfiguration="ServiceWithMetaData"
                >
            <endpoint name="Default"
                address=""
                binding="basicHttpBinding"
                bindingConfiguration="httpBinding"
                contract="MyServiceSvcNs.IMyServiceSvc"
                />
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior name="ServiceWithMetaData">
                <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
                <serviceDebug includeExceptionDetailInFaults="false" />
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
        multipleSiteBindingsEnabled="true" />
</system.serviceModel>

Con esto, las cosas parecen estar funcionando. Al menos a primera vista.

OriginalEl autor Jeff Dege | 2015-01-22

2 Comentarios

  1. 7

    OK, me lo imaginé.

    Primero, en el Administrador de IIS., es necesario desactivar la autenticación anónima, y activar la autenticación básica. Que puede requerir la habilitación de la autenticación básica en primer lugar, a continuación, reiniciar el Administrador de IIS. Esto es básico IIS cosas, y no es realmente parte de mi pregunta.

    Entonces, necesitamos hacer cambios a la web del servicio web.config. Si usted recuerda, se había parecido a esto:

    <configuration>
        <system.web>
            <compilation debug="true" targetFramework="4.5" />
            <httpRuntime targetFramework="4.5" />
        </system.web>
        <system.serviceModel>
            <behaviors>
                <serviceBehaviors>
                    <behavior name="">
                        <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
                        <serviceDebug includeExceptionDetailInFaults="false" />
                    </behavior>
                </serviceBehaviors>
            </behaviors>
            <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
                multipleSiteBindingsEnabled="true" />
        </system.serviceModel>
    </configuration>

    Tenemos que cambiar esto:

    <configuration>
        <system.web>
            <compilation debug="true" targetFramework="4.5" />
            <httpRuntime targetFramework="4.5" />
        </system.web>
        <system.serviceModel>
            <bindings>
                <basicHttpBinding>
                    <binding name="httpTransportCredentialOnlyBinding">
                        <security mode="TransportCredentialOnly">
                            <transport clientCredentialType="Basic" />
                        </security>
                    </binding>
                </basicHttpBinding>
            </bindings>
            <services>
                <service
                        name="MyServiceSvcNs.MyServiceSvc"
                        behaviorConfiguration="ServiceWithMetaData"
                        >
                    <endpoint name="Default"
                        address=""
                        binding="basicHttpBinding"
                        bindingConfiguration="httpTransportCredentialOnlyBinding"
                        contract="MyServiceSvcNs.IMyServiceSvc"
                        />
                </service>
            </services>
            <behaviors>
                <serviceBehaviors>
                    <behavior name="ServiceWithMetaData">
                        <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
                        <serviceDebug includeExceptionDetailInFaults="false" />
                    </behavior>
                </serviceBehaviors>
            </behaviors>
            <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
                multipleSiteBindingsEnabled="true" />
        </system.serviceModel>
    </configuration>

    Lo que estamos haciendo es definir un basicHttpBinding con TransportCredentialOnly de seguridad. A continuación, se define un servicio, con un extremo que utiliza ese enlace.

    A continuación, en el cliente, hemos tenido:

    <configuration>
        <startup>
            <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
        </startup>
        <system.serviceModel>
            <bindings>
                <basicHttpBinding>
                    <binding name="BasicHttpBinding_IMyServiceSvc" />
                </basicHttpBinding>
            </bindings>
            <client>
                <endpoint address="http://localhost/MyServiceSvc.svc"
                    binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IMyServiceSvc"
                    contract="MyServiceSvc.IMyServiceSvc"
                    name="BasicHttpBinding_IMyServiceSvc" />
            </client>
        </system.serviceModel>
    </configuration>

    Esto debe cambiar a:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <startup>
            <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
        </startup>
        <system.serviceModel>
            <bindings>
                <basicHttpBinding>
                    <binding name="httpTransportCredentialOnlyBinding">
                        <security mode="TransportCredentialOnly">
                            <transport clientCredentialType="Basic" />
                        </security>
                    </binding>
                </basicHttpBinding>
            </bindings>
            <client>
                <endpoint
                    address="http://localhost/MyServiceSvc.svc"
                    binding="basicHttpBinding"
                    bindingConfiguration="httpTransportCredentialOnlyBinding"
                    contract="MyServiceSvc.IMyServiceSvc"
                    name="BasicHttpBinding_IMyServiceSvc"
                    />
            </client>
        </system.serviceModel>
    </configuration>

    Aquí estamos de nuevo la creación de un basicHttpBinding con TransportCredentialOnly de seguridad, la estamos modificando el extremo de usarlo.

    OriginalEl autor Jeff Dege

  2. 1

    Configurar el basicHttpBinding en el servicio web.config de la siguiente manera

    <bindings>
      <basicHttpBinding>
        <binding name="httpBinding">
          <security mode="TransportCredentialOnly">
            <transport clientCredentialType="Basic" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    Si puedo añadir que para la web,de la configuración, y dejar habilitado la autenticación anónima, las cosas funcionan, Si puedo deshabilitar la autenticación anónima y habilitar la autenticación básica, tengo un MessageSecurityException: «La solicitud HTTP no está autorizado con el esquema de autenticación de cliente «Anónimo». El encabezado de autenticación recibido desde el servidor fue ‘Basic realm=»localhost»‘.», con una innerexception «El servidor remoto devolvió un error: (401) no autorizado.»
    Se le envía nombre de usuario y la contraseña con la solicitud? Puede registrar su código de cliente?
    La mano no ha sido. Estoy ahora. Todavía no está trabajando. Vea las ediciones a mi post original.
    Con mi configuración en su lugar y configuración de nombre de usuario/contraseña en el cliente necesita para hacer un cambio más decir bindingConfiguration=»BasicHttpBinding_IMyServiceSvc» a bindingConfiguration=»httpBinding». No use mode=»Transporte» a menos que necesite https.
    Aún viendo «El servicio solicitado, ‘localhost/MyServiceSvc.svc‘ no se pudo activar.»

    OriginalEl autor Pankaj Kapare

Dejar respuesta

Please enter your comment!
Please enter your name here