J'ai une application WCF qui utilise l'authentification Windows. Donc un objet Windows Principal est ce que je trouverai dans la propriété System.Threading.Thread.CurrentPrincipal(). C'est tout va bien. Cependant, j'ai également un objet principal personnalisé qui est utilisé pour les autorisations plus fines et l'audit. C'est un utilisateur de domaine, pas un utilisateur de Windows. J'ai vraiment besoin des deux et je cherche un endroit pour stocker l'utilisateur personnalisé du côté du service afin que tout le code qui s'exécute sur le service, à travers les couches Business et Data, puisse accéder à cet utilisateur.WCF ServiceSecurityContext Droit de stockage pour les données personnalisées?
La communication entre le client et le serveur est gérée par un inspecteur de comportement et de message personnalisé. Lorsque vous appelez le service à partir du client (application Web ASP.NET), l'utilisateur actuel est renvoyé de la session et le sérialise à un en-tête personnalisé de l'appel de service. Du côté du service, il retire ensuite le principal de l'en-tête et met le principal ici personnalisé:
OperationContext.Current.ServiceSecurityContext.AuthorizationContext.Properties("CurrentDomainUser")
Alors, des questions pour valider cette approche:
- Est-ce une approche valable pour le stockage d'un principal personnalisé sur le service. En gardant à l'esprit que je veux l'authentification Windows pour rester en place.
- Est-ce une «meilleure pratique»? Ou y a-t-il un meilleur moyen?
- Des pièges ou des embûches à surveiller avec cette approche?
Merci pour l'entrée.
Pete: merci pour l'entrée. Nous utilisons des en-têtes de message personnalisés pour envoyer notre principal personnalisé sur le fil. La partie collante est: où stocker le principal personnalisé sur le côté service? – TheZenker
Une fois que vous obtenez le principal sur le côté du service, que devez-vous faire avec? –
'MessageHeader customHeader = MessageHeader.CreateHeader (" customData "," ns "," Mes données personnalisées "); OperationContext.Current.OutgoingMessageHeaders.Add (customHeader); 'Cela ne fonctionnera pas puisque CurrentContext sera null; Ajoutez cette ligne avant d'ajouter l'en-tête au contexte 'OperationContextScope scope = new OperationContextScope (client.InnerChannel);' – iraSenthil