2009-08-25 9 views
5

J'ai un service Web WCF qui est consommé par une application client C#, et j'ai également 4 groupes stockés dans Active Directory. L'application client doit connecter ce service Web en transmettant les informations d'identification de connexion.Authentification WCF Web Service basée sur des groupes AD

Exigence:

  1. Restreint fonctionnalité de service Web basé sur le groupe de fenêtres d'identification des utilisateurs stockés dans AD (Active Directory)
  2. transmettent les informations utilisateur spécifiques de l'application cliente à ce service Web

Question:

Comment authentifier ou valider un utilisateur connecté lors de la connexion à ce service Web, quel événement gérer La fonction r sera appelée pour valider les informations d'identification de l'utilisateur connecté.

Si quelqu'un sait cela, alors s'il vous plaît ne me le faire savoir

Répondre

10

Vous devez deux garder les concepts séparés:

  • AUTHENTIFICATION est le processus de détermination qui est celui qui te demande, et s'assurer qu'il est vraiment ce qu'il prétend être; cela peut être fait en utilisant le nom d'utilisateur/mot de passe, les informations d'identification Windows (il était déjà authentifié à sa boîte de Windows par l'exploitation forestière sur), ou en exigeant l'appelant d'avoir des informations (certificat)

  • AUTORISATION est le processus - une fois que vous savez qui vous appelle, afin de déterminer ce que l'appelant peut faire (ou ce qu'il ne peut pas faire)

pour utiliser les groupes Active Directory, vous devez utiliser un mode de sécurité dans WCF supports Informations d'identification Windows Le plus simple est d'utiliser les informations d'identification Windows depuis le début, ce qui est la valeur par défaut pour wsHttpBinding et netTcpBinding - dans ce cas, l'appelant transmet toujours ses informations d'identification Windows à chaque appel, et vous pouvez les consulter du côté serveur. ServiceSecurityContext.Current.WindowsIdentity:

WindowsIdentity caller = ServiceSecurityContext.Current.WindowsIdentity; 

Cela fonctionne bien dans un scénario Intranet - tout le monde est derrière un pare-feu d'entreprise et authentifié sur leurs machines de toute façon. Pour activer ceci, utilisez juste la liaison wsHttp ou netTcp (je recommanderais netTcp dans ce cas).

L'autre cas un peu plus compliqué est lorsque votre client présente un certificat X.509, et que vous le mappez ensuite du côté serveur à un utilisateur AD existant sur votre réseau. C'est plutôt avancé, cependant.

Une fois que votre appelant est authentifié, par ex. Vous savez qui appelle, vous pouvez utiliser le modèle de sécurité basé sur les rôles standard pour limiter les privilèges. Ajoutez simplement les attributs [PrincipalPermission(....)] à vos méthodes que vous souhaitez protéger, et si l'utilisateur ne correspond à aucune de ces conditions, une exception de sécurité sera levée et la méthode ne sera pas exécutée.

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

Vous pouvez avoir plusieurs de ces « PrincipalPermission » attributs, et ils sont appariés ensemble dans un « OU » -Fashion - si l'un d'eux correspond à l'appelant actuel, il sera autorisé à faire la appel.

Consultez la page 4 de cet article Fundamentals of WCF Security pour plus d'informations sur l'utilisation de la sécurité basée sur les rôles.

Marc

+0

Merci arc, laissez-moi essayer votre solution proposée. Merci beaucoup encore. –

+0

C'est super, merci. M'a résolu beaucoup de travail. Comment attrapez-vous le SecurityException qui est lancé, cependant? Il semble être lancé avant que la méthode ne soit appelée mais ne se propage pas dans la pile d'appel ... – trendl

+0

Il est jeté au client - le client doit gérer cela. –

Questions connexes