J'ai un problème lorsque je me connecte à un service WCF d'ISS et qu'il transmet les informations d'identification du pool d'applications IIS au lieu de mes informations d'identification Windows. Quand je cours le site localement en appuyant sur F5 dans VS il passe dans mes identifiants de Windows qui est ce que je veux.Sécurité WCF: les informations d'identification incorrectes sont passées au service
Mon site Web est configuré pour utiliser l'authentification Windows et l'authentification anonyme est désactivée.
Je peux voir dans l'Observateur d'événements Windows qu'il n'utilise pas Kerberos pour se connecter à la boîte sur laquelle IIS est allumé, il utilise NTLM. Mais je peux voir qu'il est en utilisant Kerberos lors du passage d'IIS à mon service WCF en utilisant:
OperationContext.Current.ServiceSecurityContext.PrimaryIdentity.AuthenticationType.ToString()
Je pense qu'il devrait utiliser Kerberos lors de la connexion à la boîte IIS donc une idées, il serait apprécié?
Les boîtes et l'utilisateur sont configurés pour permettre la délégation et moi-même avons permet etc communication NetTcp sur mon
Voici ma config hôte qui est hébergé à l'aide d'une application de la console sur le même serveur que le serveur IIS:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="defaultBinding" closeTimeout="02:02:00" openTimeout="02:01:00"
receiveTimeout="02:10:00" sendTimeout="02:02:00" maxBufferSize="2147483647"
maxReceivedMessageSize="2147483647">
<security mode="Transport" >
<transport clientCredentialType="Windows"/>
</security>
</binding>
</netTcpBinding>
</bindings>
<behaviors>
<endpointBehaviors>
<behavior name="defaultClientBehavior">
<clientCredentials />
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="ServiceConfigBehavior">
<serviceMetadata httpGetEnabled="false" />
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceAuthorization impersonateCallerForAllOperations="true" />
<serviceCredentials>
<windowsAuthentication includeWindowsGroups="true" allowAnonymousLogons="false" />
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="ServiceConfigBehavior"
name="ServiceConfig">
<endpoint address="" behaviorConfiguration="" binding="netTcpBinding"
bindingConfiguration="defaultBinding" contract="IServiceConfig">
<identity>
<servicePrincipalName value="nettcp/RDM" />
<dns value="" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexTcpBinding" bindingConfiguration=""
contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="net.tcp://ServerName:8731/ServiceConfig/" />
</baseAddresses>
</host>
</service>
</services>
</system.serviceModel>
</configuration>
Voici ma config client:
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
<bindings>
<netTcpBinding>
<binding name="NetTcpBinding_IServiceConfig" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
hostNameComparisonMode="StrongWildcard" listenBacklog="10" maxBufferPoolSize="524288"
maxBufferSize="65536" maxConnections="10" maxReceivedMessageSize="65536">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
<security mode="Transport">
<transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
<message clientCredentialType="Windows" />
</security>
</binding>
</netTcpBinding>
</bindings>
<client>
<endpoint address="net.tcp://syrwp01:8731/ServiceConfig/"
behaviorConfiguration="defaultClientBehavior" binding="netTcpBinding"
bindingConfiguration="NetTcpBinding_IServiceConfig" contract="ServiceReference1.IServiceConfig"
name="NetTcpBinding_IServiceConfig">
<identity>
<servicePrincipalName value="nettcp/RDM" />
</identity>
</endpoint>
</client>
</system.serviceModel>
Et voici la méthode de service qui est appelé:
[OperationBehavior(Impersonation = ImpersonationOption.Allowed)]
public string PrintMessage(string msg)
{
Console.WriteLine(DateTime.Now.ToString());
WindowsIdentity callerWindowsIdentity = ServiceSecurityContext.Current.WindowsIdentity;
Console.WriteLine("AuthenticationType: " + OperationContext.Current.ServiceSecurityContext.PrimaryIdentity.AuthenticationType.ToString());
Console.WriteLine("WindowsIdentity.GetCurrent(): {0}", WindowsIdentity.GetCurrent().Name);
using (ServiceSecurityContext.Current.WindowsIdentity.Impersonate())
{
Console.WriteLine("WindowsIdentity.GetCurrent(): {0}", WindowsIdentity.GetCurrent().Name);
}
Console.WriteLine("Method called successfully!");
}