2012-10-08 3 views
2

J'ai un WebService avec des sites ASP.NET et des services WCF dans le même web.config. Jusqu'à présent, j'ai pu utiliser le impersionation ASP.NET dans les services WCF en mettantImpersion comme dans ASP.NET pour le service WCF

<system.web> 
    <compilation targetFramework="4.0" debug="false"/> 
    <!-- switch custom errors of--> 
    <identity impersonate="true"/> 
    <customErrors mode="Off"/> 
</system.web> 

Cependant, maintenant (pour d'autres raisons-> Etat pour la session sans cookies partie ASP.NET) Je dois régler la

aspNetCompatibilityEnabled="true" 

option à false. Avec cela, je perds l'impersion ASP.NET pour les services WCF. Un de mes services WCF a besoin d'une conversion pour les opérations d'E/S sur le serveur ... Je voudrais savoir comment obtenir la même incohérence que j'avais auparavant en la définissant directement sur la configuration du service WCF.

Ce que j'ai essayé (unsucessfully) est de mettre

[OperationBehavior(Impersonation = ImpersonationOption.Required)] 

sur la mise en œuvre des méthodes du service WCF puis en spécifiant

<endpoint address="" binding="wsHttpBinding" contract="IService"> 
    <identity> 
    <servicePrincipalName value="HOST/YourMachineName" /> 
    <dns value="" /> 
    </identity> 
</endpoint> 

dans le web.config (évidemment avec le les valeurs correctes pour mon service), comme décrit dans http://msdn.microsoft.com/en-us/library/ff650591.aspx.

Cependant, le service WCF ne peut plus être appelé après cela ... Il me dit que le WsHttpBinding n'offre pas une identité pour le contrat.

Ai-je oublié quelque chose d'important?

Edit: Traduction du message d'erreur:

: L'opération de contrat '{0}' identité nécessite Windows pour usurpation d'identité automatique. Une identité Windows qui représente l'appelant n'est pas fournie par la liaison ('{1}', '{2}') pour le contrat ('{3}', '{4}'

(Le message d'erreur original était allemand...)

+0

_ "n'offre pas d'identité pour le contrat" ​​_ - veuillez indiquer le message d'erreur exact. – CodeCaster

Répondre

0

Eh bien, à la fin je vient de faire l'utilisation de liaison authentification Windows:

<security mode="TransportWithMessageCredential"> 
     <message negotiateServiceCredential="false" clientCredentialType="Windows" algorithmSuite="Default"/> 
     <transport clientCredentialType="None" proxyCredentialType="None" realm="" /> 
</security> 

et passé un utilisateur Windows spécifique/combinaison PWD dans le client:

channelFactory.Credentials.Windows.ClientCredential = new NetworkCredential(@"", "", ""); 
channelFactory.Credentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation; 

De plus je devais utiliser spécifiquement les nouveaux utilisateur personnifié dans le code du service Web:

using (var imp = ServiceSecurityContext.Current.WindowsIdentity.Impersonate()) 
{ 
    // do IO here 
} 

Eh bien, la question réelle (sous-jacent) reste:

Comment est-il possible d'émuler la fonctionnalité ASP.NET correctement ...

Pour le moment, je suis ok avec la solution, mais j'ai le sentiment que j'ai manqué un point important sur l'usurpation d'identité ASP.NET.

Merci beaucoup à Iain, même si ce n'était pas exactement la bonne réponse, ça m'a au moins mis sur la bonne voie!

1

Essayez d'ajouter someting similaire à ce

<system.serviceModel> 
     <behaviors> 
      <endpointBehaviors> 
       <behavior name="DelegationBehaviour"> 
        <clientCredentials> 
         <windows allowNtlm="false" allowedImpersonationLevel="Delegation"></windows> 
        </clientCredentials> 
        <dataContractSerializer maxItemsInObjectGraph="4194304"></dataContractSerializer> 
       </behavior> 
      </endpointBehaviors> 
     </behaviors> 
     <bindings> 
      <basicHttpBinding> 
       <binding name="BasicHttpBinding_SampleWebService" > 
        <readerQuotas maxArrayLength="16384" maxBytesPerRead="4096" maxDepth="32" maxNameTableCharCount="16384" maxStringContentLength="8192"></readerQuotas> 
        <security mode="TransportCredentialOnly"> 
         <message algorithmSuite="Default" clientCredentialType="UserName"></message> 
         <transport clientCredentialType="Windows" proxyCredentialType="None" realm=""></transport> 
        </security> 
       </binding> 
      </basicHttpBinding> 
     </bindings> 
     <client> 
      <endpoint address="http://server/WebServices/Service/Service.svc" behaviorConfiguration="DelegationBehaviour" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_SampleWebService" contract="SampleWS" name="BasicHttpBinding_SampleEndpoint"></endpoint> 
     </client> 
    </system.serviceModel> 

Ce code côté serveur

<system.serviceModel> 
    <services> 
     <service behaviorConfiguration="CustomBehavior" name="CustomWebService"> 
     <endpoint address="" behaviorConfiguration="" binding="basicHttpBinding" bindingConfiguration="basicHttpBinding_Service" contract="WebService"/> 
     </service> 
    </services> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="basicHttpBinding_Service" maxReceivedMessageSize="4194304" receiveTimeout="00:30:00"> 
      <security mode="TransportCredentialOnly"> 
      <transport clientCredentialType="Windows"/> 
      <message clientCredentialType="UserName"/> 
      </security> 
     </binding> 
     </basicHttpBinding> 
    </bindings> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="CustomBehavior"> 
      <dataContractSerializer maxItemsInObjectGraph="4194304" ignoreExtensionDataObject="True"/> 
      <serviceMetadata httpGetEnabled="True"/> 
      <serviceDebug httpHelpPageEnabled="true" includeExceptionDetailInFaults="true"/> 
      <serviceAuthorization impersonateCallerForAllOperations="true"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 

En plus d'avoir ces sur nos WebMethods

<WebMethod(), OperationContract(), OperationBehavior(Impersonation:=ImpersonationOption.Required)> _ 

Works pour nous

+0

Merci pour votre réponse. Je vérifie et je vois si je peux obtenir quelque chose comme ça pour fonctionner. – Daniel

+0

Cette config a t-elle fonctionné? – Iain

+0

Je ne l'ai pas encore fait fonctionner. Je dois aussi faire travailler le client avec la configuration du service ... – Daniel

Questions connexes