2010-07-26 3 views
2

Voici ce que j'essaie de faire.WCF - Jeton d'authentification SSO et interfaces POX

Nous avons un service d'authentification SSO que d'autres pages Web et services externes utilisent pour authentifier les utilisateurs. Un utilisateur tente d'atteindre un service, si aucun cookie contenant un jeton d'authentification n'est trouvé, ils sont redirigés vers le service d'authentification SingleSignOn. Le service d'authentification fait son travail et redirige l'utilisateur (HTTP 302) vers l'URL d'origine avec son jeton d'authentification chiffré dans l'URL. Génial. Comment puis-je invoquer cela à partir d'un service POX WCF? Pas de SOAP ici, juste HTTP GET/POST avec des réponses XML.

Ce que je fais actuellement est, dans chaque méthode d'implémentation de méthode de service, en vérifiant les en-têtes pour le cookie. Si le cookie existe, vérifiez le jeton d'authentification et traitez la demande. Si le cookie n'existe pas ou le jeton d'authentification a expiré, puis répondre avec:

WebOperationContext.Current.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.Redirect; 
    WebOperationContext.Current.OutgoingResponse.Location = string.Format(authServiceURL, returnURL); 

Cela fonctionne, mais il est pas intégré à l'une des caractéristiques WCF, et me demande le code manuellement pour un tas des scénarios. Est-il possible que je pourrais mettre en œuvre cette utilisation de ces cours:

   <serviceCredentials> 
        <issuedTokenAuthentication> 
        </issuedTokenAuthentication> 

ou utiliser d'autres moyens qui vérifie chaque demande au service?

J'ai lu des pages comme: How to: Create a Custom Token, mais je ne vois pas comment cela s'applique à mes besoins.

Toutes les suggestions seraient appréciées. J'étudie cela parce que j'ai un peu de temps avant que mon projet démarre, et je voudrais mettre en œuvre ce projet correctement et en apprendre autant sur la WCF que possible.

+0

Est-ce que quelqu'un utilise SSO avec WCF? Si oui, comment l'avez-vous mis en œuvre? – MonkeyWrench

Répondre

1

Je déteste répondre à ma propre question, mais je vais poster ce que j'ai fini par faire pour cela.

Nous avons un service d'authentification vers lequel nous pouvons rediriger (Http 301) les clients, qui les redirigera vers notre service après l'ajout d'un jeton d'authentification dans l'URL. En utilisant cela, voici les étapes que mon service prend.

J'ai ajouté une implémentation System.ServiceModel.ServiceAuthorizationManager et j'ai remplacé la méthode CheckAccessCore pour rechercher le jeton d'authentification dans un cookie/en-tête ou dans l'URL. Si trouvé, je vérifierais que le jeton est valide. Cette méthode renvoie simplement true ou false, indiquant si la requête a réussi l'authentification ou non. Si le message est passé, j'ai créé un objet IExtension pour contenir certaines données et l'ai ajouté aux extensions OperationContext. J'ai également ajouté une implémentation d'un IDispathMessageInspector. Cela a des méthodes AfterReceiveRequest et BeforeSendReply. J'ai utilisé la méthode BeforeSendReply pour détourner la réponse. Si le message n'a pas passé l'authentification (n'a pas eu mon objet IExtension dans les extensions OperationContext), je mets le WebOperationContext.Current.OutgoingResponse.StatusCode à rediriger et l'emplacement à l'URL du service d'authentification. Si elle a réussi l'authentification, j'ai vérifié que le jeton d'authentification se trouvait dans le cookie/en-tête de message de réponse de la méthode BeforeSendReply.

This article m'a aidé à comprendre comment raccorder les choses. Est-ce la meilleure façon? Aucune idée. Mais cela fonctionne pour mon service WCF/REST. Il bloque tous les messages non authentifiés, même ceux qui parviennent à mon implémentation ServiceContract, en redirigeant toutes les demandes vers le service d'authentification.