Pregunta

¿Cuál es el mejor enfoque para asegurarse de que solo necesita autenticarse una vez cuando utiliza una API creada en WCF?

Mis enlaces y comportamientos actuales se enumeran a continuación

    <bindings>
        <wsHttpBinding>
            <binding name="wsHttp">
                <security mode="TransportWithMessageCredential">
                    <transport/>
                    <message clientCredentialType="UserName" negotiateServiceCredential="false" establishSecurityContext="true"/>
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>
    <behaviors>
        <serviceBehaviors>
            <behavior name="NorthwindBehavior">
                <serviceMetadata httpGetEnabled="true"/>
                <serviceAuthorization principalPermissionMode="UseAspNetRoles"/>
                <serviceCredentials>
                    <userNameAuthentication userNamePasswordValidationMode="MembershipProvider"/>
                </serviceCredentials>
            </behavior>
        </serviceBehaviors>
    </behaviors>

Lo siguiente es lo que estoy usando en mi aplicación cliente para autenticarme (actualmente debo hacer esto cada vez que quiero hacer una llamada a WCF)

Dim client As ProductServiceClient = New ProductServiceClient("wsHttpProductService")
client.ClientCredentials.UserName.UserName = "foo"
client.ClientCredentials.UserName.Password = "bar"
Dim ProductList As List(Of Product) = client.GetProducts()

Lo que me gustaría hacer es autenticar con la API una vez que use estas credenciales y luego obtener algún tipo de token durante el período de tiempo que mi aplicación cliente esté usando el proyecto de servicio web.Pensé que establishmentsecuritycontext=true hizo esto por mí.

¿Fue útil?

Solución

Si está en una intranet, la autenticación de Windows se puede manejar de forma "gratuita" únicamente mediante la configuración.

Si esto no es apropiado, los servicios de token funcionan bien, pero en algunas situaciones pueden ser demasiado.

La aplicación en la que estoy trabajando necesitaba una autenticación básica.Nuestro servidor y cliente se ejecutan dentro de una intranet (muy segura), por lo que no nos importó demasiado el requisito de utilizar un certificado X.509 para cifrar la comunicación, que es necesario si se utiliza la autenticación de nombre de usuario.

Entonces agregamos un comportamiento personalizado al cliente que agrega el nombre de usuario y la contraseña (cifrada) a los encabezados de los mensajes, y otro comportamiento personalizado en el servidor que los verifica.

Todo muy simple, no requirió cambios en la capa de acceso al servicio del lado del cliente ni en la implementación del contrato de servicio.Y como todo se hace mediante configuración, si necesitamos pasar a algo un poco más potente, será fácil migrar.

Otros consejos

Si bien odio dar una respuesta de la que no estoy 100% seguro, la falta de respuestas hasta ahora me hace pensar que una respuesta potencialmente correcta podría estar bien en este caso.

Hasta donde yo sé, no existe el tipo de mecanismo de token de sesión que está buscando listo para usar con WCF, lo que significa que tendrá que hacer un trabajo pesado para que todo funcione en el como quieras.Debo dejar claro que existe un mecanismo de sesión en WCF pero se centra en garantizar el orden de los mensajes y no es la herramienta ideal para crear una sesión de autenticación.

Acabo de terminar de trabajar en un proyecto en el que implementamos nuestro propio mecanismo de sesión para manejar todo tipo de pilas SOAP heredadas, pero creo que la forma recomendada de implementar sesiones autenticadas es utilizar un servicio de token seguro (STS) como Pablo Cibraro.

Si quieres más detalles por favor grita, pero sospecho que el blog de Pablo tendrá información más que suficiente para que puedas seguir adelante.

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