2009-10-07 4 views
1

J'ai 2 applications Web: l'une est une application Web ASP.Net et l'autre est une application de services Web ASP.Net WCF. Je souhaite que l'application Web utilise les services de consommation de l'application Web WFC. Finalement, ces 2 applications communiqueront via un pare-feu.Comment puis-je transmettre les informations d'utilisateur consignées de l'application Web ASP.Net au service WCF?

Je souhaite que l'utilisateur se connecte à l'application Web client à l'aide de l'authentification par formulaires, authentifiée par le service wcf, puis puisse accéder aux ressources de service en fonction de ses rôles.

Jusqu'ici, j'ai réussi à me connecter en utilisant System.Web.ApplicationServices.AuthenticationService bien que je n'ai pas réussi à obtenir la méthode de service IsLoggedIn pour renvoyer true. Cependant, l'application web client reconnaît que l'utilisateur s'est connecté.

En outre, j'ai été en mesure de créer un service factice qui reconnaît l'utilisateur dans OperationContext.Current.ServiceSecurityContext.PrimaryIdentity et je pensais que c'était le journal dans l'utilisateur qu'il reconnaissait mais il s'avère que c'est en fait le ServiceClient.ClientCredentials.UserName qu'il reconnaît. Comment puis-je passer les détails de l'utilisateur connecté au service WCF?

Je pourrais définir ClientCredentials.UserName à l'utilisateur connecté mais je ne peux pas penser à un moyen d'obtenir le mot de passe. Est-ce que j'utilise complètement la mauvaise approche ici ou y a-t-il quelque chose qui me manque? Tout avis sera le bienvenu.

Ceci est ma configuration de liaison:

<wsHttpBinding> 
    <binding name="wsHttp"> 
     <security mode="Message"> 
     <message clientCredentialType="UserName" 
      negotiateServiceCredential="false" 
      establishSecurityContext="false"/> 
     </security> 
    </binding> 
    </wsHttpBinding> 

Merci, Iain

Répondre

0

si je comprends bien, vous devez passer votre identification d'utilisateur connecté ASP.NET au service WCF, non? Essayez cette approche:


using (YourServiceClient client = new YourServiceClient()) 
{ 
    client.ClientCredentials.Windows.AllowedImpersonationLevel = 
      System.Security.Principal.TokenImpersonationLevel.Impersonation; 
    client.ChannelFactory.Credentials.Windows.ClientCredential = 
      CredentialCache.DefaultNetworkCredentials; 
    client.YourMethodHere(); 
} 
+0

Salut Rubens, merci pour votre réponse. Je crains que cela ne fonctionne pas parce qu'il passe par les informations d'identification de Windows plutôt que les informations d'authentification des formulaires. Merci, Iain – Iain

0

Vous pouvez certainement récupérer l'utilisateur actuellement connecté dans ASP.NET à l'aide de la propriété HttpContext.Current.User.Identity.Name - Le problème est, en général, vous n'avez pas moyen de récupérer le mot de passe de l'utilisateur à utiliser pour appeler la Service WCF.

Cela dépend vraiment de la façon dont vous faites l'authentification de vos formulaires. Avez-vous votre propre magasin? Ce magasin possède-t-il un mot de passe utilisateur sous une forme qui peut être utilisée, par ex. Le mot de passe de l'utilisateur est-il stocké en texte brut (mauvaise idée!) ou dans un schéma de chiffrement réversible?

Marc

+0

Nous utilisons le magasin de serveur sql par défaut de sorte que les mots de passe sont hachés unidirectionnels, donc il n'y a aucun moyen de les récupérer. Nous pourrions stocker le mot de passe que l'utilisateur se connecte initialement mais c'est quelque chose que nous aimerions certainement éviter. Je pense qu'il serait préférable de coder en dur un seul utilisateur pour tous les appels et passer en paramètre le nom d'utilisateur connecté. – Iain

+0

J'avais peur de ça :-) Dans ce cas, je ne vois pas vraiment comment on pourrait faire ça, malheureusement. Ce que vous pouvez envisager est d'avoir un certificat entre votre site ASP.Net et le service WCF pour s'authentifier, et envoyer le nom d'utilisateur "connecté" comme un en-tête de message à des fins d'information. Si votre utilisateur est déjà authentifié sur le site Web ASP.NET, tout devrait bien se passer, n'est-ce pas? –

0

J'ai essayé de faire quelque chose de similaire dans SharePoint. La meilleure solution que je suis en mesure de trouver est:

using (ChannelFactory<IMyContract> requestChannelFactory = new ChannelFactory<IMyContract>(binding, new EndpointAddress(endPointURL))) 
{ 
    provider = requestChannelFactory.CreateChannel(); 
    using (HostingEnvironment.Impersonate()) 
    { 
     remoteData = provider.GetData(); 
    } 
} 

Cela essaie de me authentifier DOMAIN \ SERVER $, mais malheureusement je n'ai pas trouvé un moyen de tirer les informations d'identification du client sur HttpContext et shoehorn les dans requestChannelFactory.Credentials.Windows.ClientCredential. Je suis à peu près sûr que ça ne peut pas être fait. L'alternative semble coder en dur le nom d'utilisateur/mot de passe ou en utilisant l'authentification de certificat. Cela ou permettre l'authentification anonyme qui n'est pas une option pour moi.

Questions connexes