Search code examples
c#sharepointsharepoint-2010credentialsdefaultnetworkcredentials

Sharepoint 2010 GetListItems with Webservice - ListSoapClient with DefaultNetworkCredentials


I want to get some ListItems of a SharePoint 2010 List with a Win8 App. Everything works fine when I set the Credentials manually like:

BasicHttpBinding basicHttpBinding = new BasicHttpBinding();
basicHttpBinding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
basicHttpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;

EndpointAddress endpoint = new EndpointAddress("http://site1/site2/_vti_bin/Lists.asmx");
string listName = "{4e661b3b-d0a9-4440-b98f-3f3ef41a44a7}";
string viewName = "{f1ba8d46-ad36-40ef-b4bc-6f74ea87b5d7}";
string rowLimit = "25";       
XElement ndQuery = new XElement("Query");
XElement ndViewFields = new XElement("ViewFields");
XElement ndQueryOptions = new XElement("QueryOptions");

MyService.ListsSoapClient client = new MyService.ListsSoapClient(basicHttpBinding, endpoint);
client.ClientCredentials.Windows.ClientCredential.UserName = "user";
client.ClientCredentials.Windows.ClientCredential.Password = "pw"; 
client.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;


 MyService.GetListItemsResponse response = await client.GetListItemsAsync(listName, viewName, ndQuery, ndViewFields, rowLimit, ndQueryOptions, null);

If I try to set the Credentials with the logged on Windows user i get the following Unauthorized error:

The HTTP request is unauthorized with client authentication scheme 'Negotiate'. The authentication header received from the server was 'Negotiate,NTLM'.

client.ClientCredentials.Windows.ClientCredential = System.Net.CredentialCache.DefaultNetworkCredentials;

Can you help me?


Solution

  • try this (use default credentials instead of specific):

    private ListsSoapClient CreateListsSoapClient(string siteUrl, string siteUserName, string sitePassword)
        {           
            var basicHttpBinding = new BasicHttpBinding
            {
                CloseTimeout = new TimeSpan(00, 5, 00),
                OpenTimeout = new TimeSpan(00, 5, 00),
                ReceiveTimeout = new TimeSpan(00, 5, 00),
                SendTimeout = new TimeSpan(00, 5, 00),
                TextEncoding = Encoding.UTF8,
                MaxReceivedMessageSize = int.MaxValue,
                MaxBufferSize = int.MaxValue,
                Security =
                {
                    Mode = BasicHttpSecurityMode.TransportCredentialOnly
                },
                ReaderQuotas =
                {
                    MaxArrayLength = int.MaxValue,
                    MaxBytesPerRead = int.MaxValue,
                    MaxStringContentLength = int.MaxValue
                }
            };
    
            basicHttpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Ntlm;                   
    
            var url = string.Format("{0}/_vti_bin/Lists.asmx", siteUrl);
            var address = new EndpointAddress(url);
    
            var listsSoapClient = new ListsSoapClient(basicHttpBinding, address);
    
            listsSoapClient.ClientCredentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Delegation;
            listsSoapClient.ChannelFactory.Credentials.Windows.ClientCredential = new NetworkCredential(siteUserName, sitePassword);
            listsSoapClient.ChannelFactory.Credentials.Windows.AllowNtlm = true;
    
            return listsSoapClient;
        }