2009-08-25 39 views
5

Tengo un servicio web WCF que está siendo consumido por una aplicación cliente C# y también tengo 4 grupos almacenados en Active Directory. La aplicación cliente debe conectar este servicio web al pasar las credenciales de inicio de sesión.Servicio web WCF Autenticación basada en grupos AD

Requisito:

  1. Restringir la funcionalidad del servicio web basado en el grupo de credenciales de usuario de Windows almacenada en AD (Active Directory)
  2. credenciales de usuario específico pasar de la aplicación cliente a este servicio web

Pregunta:

Cómo autenticar o validar al usuario conectado al conectarse a este servicio web, qué evento manejar La función r se invocará para validar las credenciales del usuario registrado.

Si alguien sabe de esto entonces por favor hágamelo saber

Respuesta

10

Usted necesita dos mantienen conceptos separados:

  • AUTENTICACIÓN es el proceso de determinar quién es el que te está llamando, y asegurándose de que realmente es quien dice ser; esto se puede hacer usando nombre de usuario/contraseña, credenciales de Windows (que ya había autenticado a sí mismo a su caja de Windows a través de la tala en), o exigiendo la persona que llama a tener alguna información (certificado)

  • AUTORIZACIÓN es el proceso - una vez que sabe que le está llamando, para determinar lo que llama puede hacer (o lo que no puede hacer)

para utilizar grupos de Active Directory, es necesario utilizar un modo de seguridad en WCF que los apoyos Credenciales de Windows Lo más fácil es usar las credenciales de Windows desde el principio, que es el valor predeterminado para wsHttpBinding y netTcpBinding; en este caso, la persona que llama siempre transmitirá sus credenciales de Windows con cada llamada, y puede inspeccionarlas en el servidor mirando el ServiceSecurityContext.Current.WindowsIdentity:

WindowsIdentity caller = ServiceSecurityContext.Current.WindowsIdentity; 

Esto funciona bien en un escenario de Intranet - todo el mundo está detrás de un cortafuegos corporativo y autenticado en sus máquinas de todos modos. Para habilitar esto, solo use el enlace wsHttp o netTcp (recomendaría netTcp en este caso).

El otro caso un poco más complicado es cuando su cliente presenta un certificado X.509, y luego asigna eso en el lado del servidor a un usuario AD existente en su red. Eso es bastante avanzado, sin embargo.

Una vez que la persona que llama está autenticada, p. usted sabe quién está llamando, puede usar el modelo de seguridad basado en roles para limitar los privilegios. Simplemente agregue atributos [PrincipalPermission(....)] a los métodos que desea proteger, y si el usuario no cumple con ninguno de esos requisitos, se lanzará una excepción de seguridad y el método no se ejecutará.

[PrincipalPermission(SecurityAction.Demand, Role = "Administrators")] 
    [PrincipalPermission(SecurityAction.Demand, Name = "JohnDoe")] 
    public string SayHello(string caller) 
    { 
    ...... 
    } 

Puede tener varios de esos "PrincipalPermission" atributos, y ellos están emparejados juntos en una "O" -fashion - si alguno de ellos coincide con la llamada actual, que va a ser permitido para hacer la llamada.

Consulte la página 4 de este artículo Fundamentals of WCF Security para obtener más información sobre cómo usar la seguridad basada en roles.

Marc

+0

Gracias arco, Déjame probar la solución propuesta. Muchas gracias de nuevo. –

+0

Esto es genial, gracias. Me solucionó mucho trabajo. Sin embargo, ¿cómo captas la SecurityException lanzada? Parece que se lanzó antes de que se llame al método, pero no se propaga por la pila de llamadas ... – trendl

+0

Se envía al cliente: el cliente necesita lidiar con eso. –

Cuestiones relacionadas