Question

J'ai un site web qui parle à un service Web WCF à distance. Les deux utilisent le même fournisseur FormsAuthentication personnalisé. Je voudrais authentifier auprès du service WCF se faisant passer pour l'utilisateur actuellement connecté sur le site. Je l'ai déjà fait manuellement, en utilisant les informations d'identification des clients UserName mais je dois connaître le mot de passe utilisateur. Alors, ce qui fonctionne donc péter est le suivant: un utilisateur authentifié fait une demande, je crée un client de services et définir ses pouvoirs:

serviceClient.ClientCredentials.UserName.UserName = username;
serviceClient.ClientCredentials.UserName.Password = password;

Mais ce que je veux vraiment est de passer le cookie FormsAuthentication directement, parce que je ne veux pas stocker le mot de passe de l'utilisateur.

Toutes les idées?

Était-ce utile?

La solution

On dirait que vous cherchez Windows Communication Foundation Service d'authentification .

EDIT:

Après la relecture de la question plus attentivement (et après le commentaire de Ariel) Je voudrais revenir sur la suggestion ci-dessus. Le service d'authentification WCF ne sera pas grand chose à ajouter ce scénario.

Je ne l'ai pas fait cela entre WCF et ASP.NET, mais j'ai configuré des applications ASP.NET pour partager des formulaires utilisateurs authentifiés, je peux peut-être aider en quelque sorte.

Pour vous assurer que les applications peuvent crypter / décrypter les formes cookie d'authentification de la même manière que vous devriez configurer l'élément <machineKey> pour les applications (en web.config ou machine.config selon que vous voulez faire au niveau de la machine ou de l'application). Vous devriez regarder les attributs validation, validationKey, decryption et decryptionKey.

Assurez-vous que vos éléments <forms> dans les deux fichiers web.config sont configurés de manière similaire. Plus précisément, le name, les attributs de path et domain.

Il est probable que cela ne vaut que pour les cookies transmis à / à partir d'un navigateur Web (mais peut être utile dans ce cas): Pour autoriser des cookies à passer entre les sites www.foo.com et bar.foo.com vous pouvez configurer l'élément forms comme suit pour permettre la définition de cookies sur un site et a passé avec succès à l'autre:

<forms ... domain=".foo.com" ... />

Passer le cookie au service WCF est susceptible d'être le plus délicat. Je ne suis pas très expérimenté avec WCF, donc J'ai un code adapté de kennyw.com :

HttpRequestMessageProperty httpRequestProperty = new HttpRequestMessageProperty();
httpRequestProperty.Headers.Add(HttpRequestHeader.Cookie, "<Forms Authentication Cookie>");

using (OperationContextScope scope = new OperationContextScope(serviceClient.InnerChannel))
{
  OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = httpRequestProperty;
  serviceClient.MethodName();
} 

Si vous hébergez WCF au sein de IIS (et non auto-hébergement), vous pouvez passer la demande WCF à travers le pipeline de traitement d'ASP.NET en réglant

<system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" ... />
</system.serviceModel>

Si vous êtes auto vous pouvez l'hébergement examiner les en-têtes de demande en utilisant les propriétés du message entrant dans OperationContext.Current.IncomingMessageProperties et obtenir la forme valeur du cookie d'authentification et décrypter en utilisant FormsAuthentication.Decrypt(string) .

Je ne sais pas si tout cela fonctionnerait, mais aimerais entendre si elle le fait!

Autres conseils

Il est assez simple si vous hébergez le service WCF dans le site IIS authentifié.

Compatibilité Activer en ajoutant ce qui suit à votre section system.serviceModel dans votre web.config

<system.serviceModel>  
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 
</system.serviceModel>

Ensuite, décorer chaque service que vous souhaitez accepter le cookie avec la

[AspNetCompatibilityRequirements(
    RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

Maintenant l'objet HttpContext.Current.User.Identity sera rempli correctement et vous pouvez également utiliser des demandes PrinciplePermission pour limiter l'accès par rôle ou à des utilisateurs particuliers.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top