Je sais qu'il y a beaucoup de questions sur SI semblable à cela, mais je ne pouvais pas en trouver un pour ce problème particulier.
Un couple de points, d'abord:
- J'ai aucun contrôle sur notre serveur Sharepoint. Je ne peux pas modifier un des paramètres IIS.
- Je crois que notre serveur IIS version d'IIS 7.0.
- Notre Serveur Sharepoint est d'anticiper les demandes via NTLM.
- Notre Serveur Sharepoint est sur le même domaine que mon ordinateur client.
- Je suis à l'aide .NET Framework 3.5, Visual Studio 2008
Je suis en train d'écrire une application console simple à manipuler des données Sharepoint à l'aide de Services Web Sharepoint. J'ai ajouté la Référence de Service, et celle-ci est l'une de mes applications.config:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="ListsSoap" closeTimeout="00:01:00" openTimeout="00:01:00"
receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false"
bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="Transport">
<transport clientCredentialType="Ntlm" proxyCredentialType="Ntlm" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="https://subdomain.companysite.com/subsite/_vti_bin/Lists.asmx"
binding="basicHttpBinding" bindingConfiguration="ListsSoap"
contract="ServiceReference1.ListsSoap" name="ListsSoap" />
</client>
</system.serviceModel>
C'est mon code:
static void Main(string[] args)
{
using (var client = new ListsSoapClient())
{
client.ClientCredentials.Windows.ClientCredential = new NetworkCredential("username", "password", "domain");
client.GetListCollection();
}
}
Quand je l'appelle GetListCollection(), la suite de MessageSecurityException est lancée:
The HTTP request is unauthorized with client authentication scheme 'Ntlm'.
The authentication header received from the server was 'NTLM'.
Avec un intérieur WebException:
"The remote server returned an error: (401) Unauthorized."
J'ai essayé différentes liaisons et divers code des astuces pour essayer de s'authentifier correctement, mais en vain. Je vais faire une liste de celles ci-dessous.
J'ai essayé les étapes suivantes:
À l'aide d'un natif Win32 Imitateur d'avant la création du client
using (new Impersonator.Impersonator("username", "password", "domain"))
using (var client = new ListsSoapClient())
{
client.ClientCredentials.Windows.ClientCredential = new NetworkCredential("dpincas", "password", "domain");
client.GetListCollection();
}
Cela produit le même message d'erreur.
Réglage TokenImpersonationLevel pour mon client les informations d'identification
using (var client = new ListsSoapClient())
{
client.ClientCredentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation;
client.GetListCollection();
}
Cela produit le même message d'erreur.
En utilisant le mode de sécurité=TransportCredentialOnly
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Ntlm" />
</security>
Il en est résulté dans un autre message d'erreur:
The provided URI scheme 'https' is invalid; expected 'http'.
Parameter name: via
Cependant, j'ai besoin d'utiliser le protocole https, donc je ne peux pas modifier mon schéma d'URI.
J'ai essayé d'autres combinaisons que je ne me souviens pas, mais je vais les poster quand je fais les. Je suis vraiment à bout de ressources ici. Je vois beaucoup de liens sur Google que de dire "passer à Kerberos", mais mon serveur semble être la seule à accepter de NTLM, pas de "Négocier" (comme il dirait si elle était à la recherche pour Kerberos), donc ce n'est malheureusement pas une option.
Aucune aide là-bas, les gens?