WCF Proxy et userPrincipalName
-
11-09-2019 - |
Question
Nous avons une application assez importante mon équipe et moi sommes en développement qui contient un certain nombre de services basés sur NetTcp WCF. Le service Windows, ce système sera en cours d'exécution sous ne sera pas un compte local, mais un utilisateur standard de domaine (avec des privilèges d'administrateur sur les serveurs hébergeant le service). Au milieu de tester la connectivité je suis tombé sur un problème où les appels SSPI échouent. Sur la base de quelques heures de recherche, cela m'a conduit sur le chemin de me manque la ligne suivante de ma config client:
<identity>
<userPrincipalName value="MACHINE\user" />
</identity>
Le problème est que j'utiliser ce ne l'utilise pas ou VS svcutil pour générer un client / proxy pour ce service - les procurations utilisées sont complètement écrits dans le code et ils hériteront System.ServiceModel.ClientBase. Je crois que la raison initiale de cette option a été retenue était que nous puissions utiliser les mêmes objets de DataMember exacts qui passent à travers les services de part et d'autre de la clôture - troisième groupes de parties ne seront pas besoin de se connecter à nos services pour ce n'était pas un problème .
Quelqu'un sait-il un moyen pour moi de mettre en userPrincipalName dans le client (code ou par une config) quand je n'ai pas points d'extrémité spécifiés dans la section configuration standard de system.serviceModel?
Voici ce que mon web.config côté client ressemble de référence:
<system.serviceModel>
<diagnostics>
<messageLogging logEntireMessage="true" logMalformedMessages="true"
logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" />
</diagnostics>
<behaviors>
<serviceBehaviors>
<behavior name="includeExceptions">
<serviceDebug includeExceptionDetailInFaults="true"/>
<dataContractSerializer maxItemsInObjectGraph="2147483647"/>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<netTcpBinding>
<binding name="NetTcpBinding_Default" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="Infinite" sendTimeout="01:00:00" portSharingEnabled="true" transferMode="Buffered" maxReceivedMessageSize="2147483647">
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
<security mode="Transport">
<transport clientCredentialType="Windows" protectionLevel="EncryptAndSign"/>
</security>
</binding>
</netTcpBinding>
</bindings>
</system.serviceModel>
La solution
Créer vos procurations ne manuellement vous empêche pas de mettre la configuration dans le fichier de configuration; vous avez juste besoin d'exposer la surcharge constructeur directement dans votre classe proxy dérivée ClientBase-que les délégués à la
Autres conseils
Bien que je ne suis probablement pas répondre directement à votre question, d'utiliser le même DataMember sur les deux côtés de la clôture, vous n'avez pas besoin de créer manuellement les procurations. Ce que vous faites est que vous générez vos procurations en utilisant svcutil et vous passez dans la dll qui a votre DataMember comme / r
par exemple
svcutil http://localhost/service/service.svc /r:AssemblyThatHasDataMembers.dll /out:ServiceProxy.cs
Avec cela, les types de DataMember ne sont pas répétés dans votre fichier ServiceProxy.cs. Vous pouvez personnaliser cette largement en passant wsdl / xsd (véritable contrat première approche), personnaliser les collectiontypes avec / ct, etc etc
Cela vous permettra d'économiser de nombreuses heures d'artisanat manuellement vos procurations, et en même temps d'éviter des problèmes comme ci-dessus que vous pouvez rencontrer parce que tout devient étalon.