2010-05-26 4 views
3

J'ai trois services Web, tous situés sur le même serveur. Mon client appelle le service A, qui emprunte l'identité du client pour appeler le service B, et tout va bien.Services Web WCF - Emprunt d'identité à plusieurs bonds sur le même serveur

Maintenant, je veux emprunter l'identité de l'appelant du service B (qui est mon nom d'utilisateur) pour appeler le service C. Lorsque j'utilise la même technique que précédemment (AllowedImpersonationLevel = Impersonate, user.Impersonate()), L'utilisateur ne reçoit pas transmis au service C. Au lieu de cela, le service C voit l'utilisateur comme l'utilisateur sous lequel je l'exécute dans IIS (qui est un UPN, pas le compte standard NETWORK SERVICE).

Y at-il quelque chose de spécial que je dois faire pour que cela fonctionne? Est-ce un problème de délégation? (Je pensais que ce ne serait pas la délégation, car ils sont tous sur le même serveur)

Merci SO!

Répondre

0

Vous avez besoin d'une délégation dans ce scénario. La configuration dont vous avez besoin est ImpersonationLevel.Delegation (définie dans config ou code). Jetez un coup d'œil sur le guide de sécurité de la WCF sur le codeplex, c'est une très bonne source. Soyez prudent lorsque vous réalisez une délégation, en particulier dans un environnement de production, plus que simplement sélectionner l'option correcte dans le fichier de configuration. Vous devez vous assurer que l'application à laquelle vous vous connectez, par ex. Serveur SQL, sont configurés pour la délégation et certaines exigences d'infrastructure sont remplies dans le répertoire actif et similaires, tels que les noms principaux de service (SPN).

0

Vous pouvez essayer d'allumer ASP.Net Compatibilité sur le service C

Dans Web.cofig

<system.web> 
    <identity impersonate="true"/> 
    <authentication mode="Windows"/> 
</system.web> 
<system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 
</system.serviceModel> 

Dans votre classe de service

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
public class Service : IService 
{ 
    public string ExecuteRequest(string xmlRequest) 
    { 
     IRequestManager requestManager = new RequestManager(); 
     return requestManager.ProcessRequest(xmlRequest); 
    } 

} 
0

Je me serais attendu à devoir utiliser délégation puisque vous traversez deux fois les limites du processus. Avez-vous essayé TokenImpersonationLevel.Delegation?

Questions connexes