Pregunta

Mi pregunta es en cuanto a los mejores (también conocido como "menos dolorosa") para garantizar el acceso a un servicio WCF que solo está expuesto a nuestra empresa a los usuarios internos.El objetivo es garantizar que el servicio sólo se accede a través de una sola aplicación de Windows forms que cada uno de nuestros usuarios ha instalado.Cuando el servicio se llama, quiero el servicio para poder validar que fue llamado desde el permitido de la aplicación.

El servicio de asegurados utiliza basicHttpBinding, que soporta streaming, así que creo que estoy limitado a la seguridad de nivel de Transporte.

A continuación son versiones simplificadas de la <bindings> y <services> las secciones de mi servicio el archivo de configuración.

<bindings>
  <basicHttpBinding>
    <binding name="Service1Binding" transferMode="Streamed"/>    
  </basicHttpBinding>
</bindings>

<services>
    <service name="WCFServiceSecurity.Service1" 
        behaviorConfiguration="WCFServiceSecurity.Service1Behavior">
        <endpoint address=""
            binding="basicHttpBinding"
            contract="WCFServiceSecurity.IService1"
            bindingConfiguration="Service1Binding"/>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
    </service>
</services>

Nadie ofrece algunos detalles en cuanto a qué acciones debo tomar para implementar la seguridad en este servicio?

Nota:Soy nuevo en el WCF y no estoy familiarizado con la seguridad en todos, así que me saber si no ha proporcionado suficiente detalle.


ACTUALIZACIÓN:

Como sugerido por marc_s, Me gustaría conseguir el servicio WCF utilizando algún tipo de nombre de usuario/contraseña mecanismo.Esto le da un poco más de dirección hacia una respuesta, pero todavía estoy un poco borrosa en ¿ para hacer esto posible.

Porque mi servicio requiere de streaming para ser habilitado, tengo que usar basicHttpBinding y seguridad de nivel de Transporte (¿verdad?);además, el método que figura en mi servicio solo puede aceptar un objeto Stream.

Tomando esas restricciones en consideración junto con mi preferencia para el uso de nombre de usuario/contraseña de validación...

  • ¿Cómo debo modificar mi servicio de archivo de configuración para forzar el nombre de usuario/contraseña de credenciales para ser suministrado?
  • ¿Cómo será mi servicio de validar las credenciales suministradas?
  • ¿Cómo será mi aplicación cliente de pasar las credenciales del servicio al realizar una llamada?
  • Será esto requiere el uso de SSL y, de ser así, todos los equipos cliente que requiera un certificado así?

ACTUALIZACIÓN:

Después de explicar los problemas que he tenido con la obtención de este servicio a mi jefe, me fue dado el visto bueno a probar la Autenticación de Windows la ruta.Lamentablemente, no he tenido ninguna suerte en la implementación de este tipo de autenticación con mi Streaming de servicio (argh).Después de hacer los cambios apropiados (como se indica aquí - la única excepción de que mi transferMode="Streamed") y acceder a mi servicio, me fue presentado con el siguiente error:

Solicitud HTTP streaming no puede ser utilizado en conjunción con la autenticación HTTP.O bien deshabilitar la solicitud de streaming o especificar anónimo autenticación HTTP.

Entonces me topé con la siguiente cita aquí que ofrece algunas aclaraciones:

Usted no puede hacer el transporte de auth.con el streaming. Si usted tiene que utilizar solicitud HTTP streaming, tendrás que correr sin seguridad.

La forma en que funciona la seguridad es:

WCF Cliente realiza una petición http al Servidor.

El Servidor responde con algo diciendo, "Usted no está autorizado, que me envíe un básico/compendio/etc credencial."

El Cliente recibe la respuesta y vuelve a enviar su mensaje con las credenciales que se viró.

Ahora el Servidor recibe el mensaje, comprueba las credenciales, y continúa.Solicitud de Transmisión no está diseñado para trabajar con el patrón de seguridad.Si lo hiciera, sería muy lento, ya que el Cliente podría enviar toda la corriente, hacer llegar el mensaje desde el Servidor que no estaba autorizado, entonces habría que volver a enviar toda la corriente con credenciales.

Así que ahora estoy buscando opiniones, ¿cómo podría usted asegurar su función de streaming de servicio WCF? Como se mencionó anteriormente, algún tipo de nombre de usuario/contraseña de dispositivo preferido.Siéntase libre de pensar fuera de la caja en este...

Cualquier ayuda es mucho apreciado!

¿Fue útil?

Solución

Bueno, encontré muchos problemas relacionados con la seguridad / transmisión mientras trabajaba en este problema. El truco (er ... um ... solución alternativa) con el que finalmente terminé fue crear un nuevo DataContract que hereda MemoryStream y lo decoró con una propiedad BaseStream (para mantener los datos que quiero transmitir) junto con las propiedades apropiadas utilizadas para autenticación simple.

Aquí está el DataContract resultante:

[DataContract]
[KnownType( typeof( MemoryStream ) )] 
public class StreamWithCredentials : MemoryStream
{
    [DataMember]
    public Stream BaseStream { get; set; }

    [DataMember]
    public string Username { get; set; }

    [DataMember]
    public string Password { get; set; }
}

El DataContract anterior termina siendo el parámetro de entrada del método de mi servicio. La primera acción que toma mi servicio es autenticar las credenciales proporcionadas contra los valores válidos conocidos y continuar según corresponda.

Ahora sé que esta no es la opción más segura, pero mi directiva era evitar el uso de SSL ( que ni siquiera estoy seguro de que sea posible de todos modos, como se indicó aquí ) para este proceso interno.

Dicho esto, esta fue la mejor solución para el problema mencionado anteriormente que se me ocurrió, espero que esto ayude a cualquier otra persona afectada por este problema.

Gracias a todos los que respondieron.

Otros consejos

Hay varias cosas que puedes hacer:

  • agregue un certificado a todas y cada una de las máquinas que pueden usar su servicio y verifique ese certificado. Eso solo le permite excluir & Quot; no autorizado & Quot; máquinas: no puede limitarlo a una aplicación específica
  • igual que el anterior, pero incluya el certificado incrustado en su aplicación winforms y envíelo desde allí (no lo guarde en el almacén de certificados de la máquina)
  • requiere un nombre de usuario / contraseña que solo esa aplicación en particular conozca y pueda transmitir a su servicio; p.ej. alguien más no podría presentar las credenciales apropiadas

EDITAR 2: OK, entonces el enfoque de nombre de usuario / contraseña parece salirse de control ... ¿qué pasa si solo tiene seguridad de transporte básica (SSL) para protección básica y luego usa MessageContract para definir encabezado y cuerpo de su mensaje SOAP, incluya un valor específico en el encabezado, y luego simplemente verifique la presencia del elemento en el encabezado de su servicio.

Algo así:

[DataContract]
class YourRequestData
{
 ...
}

[MessageContract]
public class YourRequest
{
  [MessageBodyMember]
  public YourRequestData bodyData { get; set; }

  [MessageHeader]
  public string AppThumbprint { get; set; }
}

Y luego en su servidor en su código simplemente verifique la presencia y la validez de ese AppThumbprint código:

public Stream RequestStream(YourRequest request)
{
  if(AppThumbprintIsValid(request.AppThumbprint))
  {
     .... begin your streaming
  }
}

Eso podría ser mucho más fácil que el escenario de seguridad de nombre de usuario / contraseña.

Marc

Corrígeme si estoy equivocado, pero:

si está utilizando la autenticación de formularios para su servicio WCf (en asp.net), simplemente agregue un método de inicio de sesión a su servicio, en él creará la cookie requerida (formsAuthentication.Authenticate ()). que se envía automáticamente con la respuesta, el cliente puede llamar a la API de transmisión sin necesidad de parámetros adicionales (un requisito para que sea TRANSMISIÓN) y puede verificar la identidad en la API de transmisión antes de activar la transmisión que regresa.

En cuanto a asegurar el acceso a todo el WCF, tengo la sensación de que incrustar un certificado en la aplicación .net es un camino a seguir. tendrían que instalar su aplicación para acceder a ella.

puede decirle a asp.net/wcf que no proporcione el wsdl, o más exactamente, para que no genere automáticamente el wsdl. Sin acceso wsdl, les resulta mucho más difícil generar un proxy ...

Si desea usar basicHttpBinding (para interoperabilidad) solo puede pasar su credencial a nivel de mensaje. Debe configurar su configuración de seguridad en TransportWithMessageCredential.

Para hacerlo, debe crear un canal SSL, por lo que necesita un certificado en el lado del servidor, y no es necesario que un cliente tenga uno.

Es posible utilizar la autenticación de Windows con el Streaming y SSL, pero usted debe usar TransportWithMessageCredential:

<basicHttpBinding>
    <binding name="FileService.FileServiceBinding" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" transferMode="Streamed">
        <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
        <security mode="TransportWithMessageCredential">
            <transport clientCredentialType="Windows" />
        </security>
    </binding>
</basicHttpBinding>

Usted necesita establecido en el código proxy.ClientCredentials.UserName.UserName y proxy.ClientCredentials.UserName.Password.

Si esta va a ser una aplicación que vive en la intranet, podría ser más fácil crear un nuevo grupo en su Active Directory y solo darles a los miembros de ese grupo la posibilidad de usar el servicio.

Puede agregar autenticación (usando credenciales de Windows) con algo como esto:

<basicHttpBinding> 
 <security mode="TransportCredentialOnly"> 
  <transport clientCredentialType="Windows" /> 
 </security> 
</basicHttpBinding> 

Podría entonces Autorizar decorando la Interfaz a sus métodos de servicios:

<PrincipalPermission(SecurityAction.Demand, Role:="MyAppsUsers")> _ 
Public Function MyMethod() As String Implements IService.MyMethod 

Aquí hay un buen enlace a Seguridad en WCF. Tiene muchos procedimientos al final (el titulado 'Cómo - Usar basicHttpBinding con Windows Authentication and TransportCreditals' podría serle útil).
Wcf Secruity

[Descargo de responsabilidad: ¡también soy nuevo en WCF y no he & # 8217; ¡ya he hecho este caso exacto antes, así que me disculpo si esto está ligeramente apagado!

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