Pregunta

estoy desarrollando servicios WCF con basicHttpBinding , estos servicios deben ser accesibles utilizando .NET 1.1 y .NET 2.0, para este fin estoy usando basicHttpBinding . En
antiguos servicios ASMX web que Assed una cabecera SOAP (AuthHeader) para autenticar al usuario todas las solicitudes.
¿Cómo puedo autenticar en WCF utilizando basicHttpBinding ? Cualquier muestra o tutorial servicial.


NRK

¿Fue útil?

Solución

Se puede utilizar AuthHeader como lo hizo antes de cambiar a WCF. Tal vez sea más conveniente para usted, la causa de los Princples seguirá siendo el mismo. Lo malo que veo en esta solución es una transferencia contraseña en texto plano. De todos modos, es sólo otra opción y puede cifrar / descifrar la contraseña de alguna manera.

En este caso se debe implementar su propio su IDispatchMessageInspector y IClientMessageInspector, como

[AttributeUsage(AttributeTargets.Class)]
public class CredentialsExtractorBehaviorAttribute : Attribute, IContractBehavior, IDispatchMessageInspector
{
    #region IContractBehavior implementation.

    public void ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint,
                                      DispatchRuntime dispatchRuntime)
    {
        dispatchRuntime.MessageInspectors.Add(this);
    }

    ... empty interface methods impl skipped ...

    #endregion

    #region IDispatchMessageInspector implementation.

    public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
    {
        int i = request.Headers.FindHeader("username", "sec");
        if (-1 != i)
        {
            string username = request.Headers.GetHeader<string>("username", "sec");
            ... do smth ...
        }
        return null;
    }

    public void BeforeSendReply(ref Message reply, object correlationState)
    {
        return;
    }

    #endregion
}

En una muestra coloqué a la cabecera única nombre de usuario, pero se puede poner en práctica su clase que contiene un nombre de usuario y contraseña y utilizarla en lugar de cadena. En el cliente:

internal class CredentialsInserter : IContractBehavior, IClientMessageInspector
{
    private string m_username;

    public CredentialsInserter(string username)
    {
        m_username = username;
    }

    #region IContractBehavior implementation.

    ... empty interface methods impl skipped ...

    public void ApplyClientBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint,
                                    ClientRuntime clientRuntime)
    {
        clientRuntime.MessageInspectors.Add(this);
    }

    #endregion

    #region IClientMessageInspector implementation.

    public object BeforeSendRequest(ref Message request, IClientChannel channel)
    {
        MessageHeader<string> mh = new MessageHeader<string>(m_username);
        request.Headers.Add(mh.GetUntypedHeader("username", "sec"));
        return null;
    }

    public void AfterReceiveReply(ref Message reply, object correlationState)
    {
        return;
    }

    #endregion
}

A continuación, se debe colocar CredentialsExtractorBehaviorAttribute atributo en la clase de implementación del servicio.

[CredentialsExtractorBehavior]
public class DummyService : IDummyService
{
   ... impl ...
}

Y en el lado del cliente debe hacer lo siguiente:

        using (DummyServiceClient c = new DummyServiceClient("TcpEndpoint"))
        {
            c.ChannelFactory.Endpoint.Contract.Behaviors.Add(
                new CredentialsInserter("_username_"));
            c.DummyMethod();
        }

Otros consejos

En primer lugar - sí se puede! Depende de si se utiliza transporte o mensaje de unión -. Si usted está expuesto a Internet, es más probable que el uso de seguridad basada en mensajes

Por desgracia, para la seguridad basada en mensajes, basicHttpBinding sólo es compatible con los certificados, que es un poco de dolor.

wsHttpBinding por otro lado apoyaría nombre de usuario / contraseña o otros métodos también.

Se había wsHttpBinding configurar las credenciales del cliente con nombre de usuario / contraseña a través de la seguridad basada en mensajes como este:

  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="wsUserName">
          <security mode="Message">
            <message clientCredentialType="UserName"/>
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <services>
      <service name="yourservice">
        <endpoint name="YourEndpoint"
                  address=""
                  binding="wsHttpBinding"
                  bindingConfiguration="wsUserName"
                  contract="IYourService" />
      </service>
    </services>
  </system.serviceModel>

La sección bajo <bindings> define un unión de configuración para wsHttpBinding que los usos de mensajes de seguridad con las credenciales del cliente nombre de usuario / contraseña.

La sección bajo <service> define un servicio de ejemplo que utiliza wsHttpBinding y que las referencias que la configuración de unión que se acaba de definir.

En el lado del servidor, se puede ahora utilizar el nombre de usuario / contraseña que está viajando por el alambre para validar las personas que llaman ya sea en su Active Directory (todo el mundo necesita una cuenta de llamadas AD con usted), o en el sistema de suscripción de ASP.NET base de datos; o si realmente debe, podría escribir su propio mecanismo de autenticación, también.

Para una gran cantidad de información útil sobre WCF seguridad en CodePlex -. excelente recurso

Comprobar los escenarios aquí para tratar de igualar uno a su situación. Cada escenario está dotado de un chceklist de elementos necesarios para implementar la solución.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top