2011-05-24 2 views
3

J'utilise WIF avec STS. Tout fonctionne bien et le client s'authentifie en envoyant le nom d'utilisateur/mot de passe dans les informations d'identification.Possibilité d'avoir WCF STS avec nom d'utilisateur/mot de passe et certificat client?

Nous installons des clients sur les sites des clients. Ce que je voudrais, c'est que chaque client utilise son propre certificat pour ses clients. La raison en est qu'il n'y a pas de validation "site-client" possible. Je peux désactiver certains comptes d'utilisateur mais je ne peux pas désactiver tous les clients installés chez un client à la fois.
Si chaque client avait un certificat différent, je pourrais révoquer le certificat et aucun client de ce client ne pourrait plus se connecter.

Je n'ai trouvé aucun moyen de forcer le client à définir son certificat pour la communication. Habituellement, cela est automatique lorsque le mode d'authentification est défini sur certificat mais je dois le définir à Windows pour pouvoir envoyer l'authentification.

Est-ce que quelqu'un a une idée sur la façon d'y parvenir? Ou laissez-moi savoir si ce n'est pas possible.

Cheers.

Répondre

2

Bien sûr, il vous suffit de faire un petit jeu de pieds pour commencer, en commençant par un élément d'extension de liaison de sécurité personnalisé pour décrire les jetons et lequel devrait être utilisé pour la signature/approbation. À des fins d'explication, je vais supposer que toujours veut à la fois le certificat et un nom d'utilisateur/mot de passe transmis.

Dans l'élément de liaison personnalisé, vous devez créer un TransportSecurityBindingElement et lui ajouter des paramètres de jeton. Il existe trois collections pour ajouter des paramètres de jeton: SignedEncrypted, Signed et Endorsing. Pour le scénario dont nous parlons ici, je recommande d'ajouter le UserNameSecurityTokenParameters à la collection SignedEncrypted et le X509SSecurityTokenParameters à la collection Endorsing. Cela signifie que la validité/intégrité du message est fournie par le jeton de certificat plutôt que par le nom d'utilisateur/mot de passe et que le jeton nom d'utilisateur/mot de passe sera signé et crypté par le jeton de certificat. Cela ressemble à quelque chose comme ce qui suit:

public class MySecurityBindingElement : BindingElementExtensionElement 
{ 
    public override void ApplyConfiguration(BindingElement bindingElement) 
    { 
     base.ApplyConfiguration(bindingElement); 

     TransportSecurityBindingElement transportSecurityBindingElement = (TransportSecurityBindingElement)bindingElement; 

     transportSecurityBindingElement.EndpointSupportingTokenParameters.SignedEncrypted.Add(new UserNameSecurityTokenParameters()); 

     transportSecurityBindingElement.EndpointSupportingTokenParameters.Endorsing.Add(new X509SecurityTokenParameters 
     { 
      InclusionMode = SecurityTokenInclusionMode.AlwaysToRecipient, 
      ReferenceStyle = SecurityTokenReferenceStyle.Internal, 
      RequireDerivedKeys = false, 
      X509ReferenceStyle = X509KeyIdentifierClauseType.Any 
     });   
    } 

    protected override BindingElement CreateBindingElement() 
    { 
     TransportSecurityBindingElement result = new TransportSecurityBindingElement 
     { 
      IncludeTimestamp = true, 
      LocalClientSettings.DetectReplays = false, 
      LocalServiceSettings.DetectReplays = false 
     }; 

     this.ApplyConfiguration(result); 

     return result; 
    } 
} 

Ensuite, du point de vue du client, vous faites juste vous de définir le certificat et le mot de passe de nom d'utilisateur se définir pour chaque canal que vous utilisez pour communiquer avec le serveur. Vous pouvez le faire lors de l'exécution en définissant les propriétés sur the Credentials property de la classe ChannelFactory ou d'une classe WCF standard, ClientBase proxy. Une autre chose que vous pouvez faire est de définir le certificat client via un comportement de point de terminaison comme ceci:

fait de cette façon, vous ne jamais besoin de définir explicitement le nom d'utilisateur/mot de passe lors de l'exécution. Enfin, au STS, vous pouvez lire les jetons spécifiés par l'utilisateur via la propriété OperationContext::SupportingTokens. Vous trouverez des instances de UserNameSecurityToken et X509SecurityToken dans la collection et à partir de là vous pouvez les utiliser pour authentifier l'appelant.

+0

Merci pour la réponse rapide! Je n'ai pas pensé à utiliser une liaison de sécurité personnalisée. Je vais essayer demain alors. J'espérais qu'il y avait une façon "intégrée" de le faire cependant. – R4cOON

+0

Rien hors de la boîte, mais au moins les boutons et les commutateurs sont là.;) –

+0

Donc, cela s'applique à un STS personnalisé ou peut-il être fait via ADFS v2.0? – nzpcmad

Questions connexes