2011-03-23 3 views
2

J'ai un service WCF qui utilise wsHttpBinding avec la sécurité des messages et l'authentification Windows.Usurpation d'identité dans le service WCF hébergé dans SharePoint 2010 authentifié par revendications

Un client de service d'application console peut appeler le service, et je peux voir que les deux ServiceSecurityContext.Current.WindowsIdentity et Thread.CurrentPrincipal.Identity représentent le bon utilisateur.

Le paramètre currentprincipal est une IClaimsIdentity, comme prévu.

Le problème se produit lorsque j'essaie d'ouvrir un site Web SharePoint: j'obtiens une erreur d'accès refusé suggérant que l'identité usurpée ne peut pas être transmise à la base de données ou au serveur SharePoint Server. Tout cela est dans la même machine, donc il ne devrait pas y avoir de problèmes d'authentification double-hop. Est-ce que ce n'est pas la manière correcte d'effectuer une authentification sans tête par rapport à un service hébergé dans une application de réclamations?

+0

Comment ouvrir le Web SP? Utilisez-vous la surcharge du constructeur qui accepte un SPUserToken? – Timores

+0

J'ai aussi essayé ça. Il semble que mon IClaimsIdentity est un Microsoft.IdentityModel.WindowsClaimsIdentity, plutôt qu'un Microsoft.IdentityModel.ClaimsIdentity. Le constructeur SPUserToken de SharePoint lève une exception si l'objet IClaimsIdentity est tout sauf une ClaimsIdentity. – BoldBob

+0

Je suppose que vous devez transformer les revendications. Avez-vous essayé d'instancier une ClaimsIdentity à partir d'une WindowsClaimsIdentity? – Timores

Répondre

0

J'ai actuellement des services WCF déployés dans un site SharePoint 2010 prenant en charge les revendications. Les services WCF n'ont rien de fantaisie et j'utilise le Microsoft.SharePoint.Client.Services.MultipleBaseAddressBasicHttpBindingServiceHostFactory fourni en tant que fabrique de service WCF. Ainsi, j'utilise le BasicHttpBinding out-of-the-box fourni par l'usine.

Mon app.config client se présente comme suit:

<configuration> 
    <system.serviceModel> 
    <bindings> 
     <binding name="BasicHttpBinding_MyServices" closeTimeout="00:01:00" 
     openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
     allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
     maxBufferSize="200524288" maxBufferPoolSize="200524288" maxReceivedMessageSize="200524288" 
     messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
     useDefaultWebProxy="true"> 
     <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
      maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
     <security mode="TransportCredentialOnly"> 
      <transport clientCredentialType="Ntlm" proxyCredentialType="None" realm="" /> 
      <message clientCredentialType="UserName" algorithmSuite="Default" /> 
     </security> 
     </binding> 
    </bindings> 
    <client> 
     <endpoint address="http://localhost/_vti_bin/MyServices/MyService.svc" 
     binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_MyServices" 
     contract="ServiceClient.MyService.IMyService" 
     name="BasicHttpBinding_IMyService" /> 
    </client> 
    </system.serviceModel> 
</configuration> 

En regardant mon Thread.CurrentPrincipal.Identity, il est exact. C'est une ClaimsIdentity avec mon utilisateur en cours d'exécution. Je peux alors simplement ouvrir une nouvelle instance de SPSite sans devoir créer ou utiliser un SPUserToken.

Une chose importante à noter: Je ne personnifie pas mon identité avant de me connecter au service WCF. Si c'est ce que vous faites, il est peu probable que votre serveur SharePoint ait une confiance établie avec votre fournisseur de revendications.

Questions connexes