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.
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
Rien hors de la boîte, mais au moins les boutons et les commutateurs sont là.;) –
Donc, cela s'applique à un STS personnalisé ou peut-il être fait via ADFS v2.0? – nzpcmad