Sharepoint 2010 GetListItems with Webservice - ListSoapClient with DefaultNetworkCredentials

时间:2016-07-27 06:48:26

标签: c# sharepoint sharepoint-2010 credentials defaultnetworkcredentials

我希望使用Win8应用程序获取SharePoint 2010列表的一些ListItem。当我手动设置凭证时,一切正常:

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);

如果我尝试使用已登录的Windows用户设置凭据,则会收到以下未经授权的错误:

  

HTTP请求未经授权使用客户端身份验证方案   '谈判'。从服务器收到的身份验证标头是   '协商,NTLM'。

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

你能帮助我吗?

1 个答案:

答案 0 :(得分:0)

试试这个(使用默认凭据而不是特定凭证):

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;
    }