2013-01-21 3 views
0

Я хочу получить список всех групп, к которым пользователь принадлежит в SharePoint, используя консольное приложение. Я новичок в SharePoint dev, так что вот моя, по общему признанию, дилетантская попытка.SharePoint GetGroupCollectionFromUser Web Service Возвращает «HTTP-запрос был запрещен» ошибка

private static string GetUserGroupCollection(string LoginName) 
    { 

     UserGroupSoapClient ug = new UserGroupSoapClient(); 
     ug.ClientCredentials.Windows.ClientCredential.UserName = "myusername"; 
     ug.ClientCredentials.Windows.ClientCredential.Password = "mypassword"; 
     return (ug.GetGroupCollectionFromUser(LoginName)).ToString(); 
    } 

Я включил «Service Reference» на мой SP веб-сервис доступен на http://server02/aaa/DOCS/_vti_bin/usergroup.asmx

Когда я пытаюсь выше код я получаю The HTTP request was forbidden with client authentication scheme 'Anonymous'.

Можете ли вы показать мне простой пример того, как это можно сделать? Обратите внимание, что я не хочу ссылаться на ссылку «Веб-ссылка». Спасибо.

+0

Не могли бы вы поделиться своим app.config? Я думаю, что проблема заключается в настройке конфигурации httpBinding. –

ответ

3

Если WebServices SharePoint веб-приложений аутентификации использование NTLM вы можете попробовать это

ug.ClientCredentials.Windows.ClientCredential = new NetworkCredential("myusername", "mypassword"); 

и в вашем app.config

<security mode="Transport"> 
    <transport clientCredentialType="Ntlm" proxyCredentialType="None" realm="" /> 
    <message clientCredentialType="UserName" algorithmSuite="Default" /> 
</security> 

Отредактировано:

Поскольку проверка подлинности NTLM отключена в вас сети приложения для доступа к веб-службам, вы должны сначала войти в систему с помощью веб-службы Authentication.asmx и получить ieve куки аутентификации и отправить его с другими вызовами веб-сервисов, как это:

  string cookie = ""; 
     LoginResult loginResult; 
     string result; 

     AuthenticationSoapClient authentication = new AuthenticationSoapClient(); 
     UserGroupSoapClient ug = new UserGroupSoapClient(); 

     using(OperationContextScope scope = new OperationContextScope(authentication.InnerChannel)) 
     { 
      loginResult = authentication.Login("user", "pass"); 
      if (loginResult.ErrorCode == LoginErrorCode.NoError) 
      { 
       MessageProperties props = OperationContext.Current.IncomingMessageProperties; 
       HttpResponseMessageProperty prop = props[HttpResponseMessageProperty.Name] as HttpResponseMessageProperty; 
       string cookies = prop.Headers["Set-Cookie"]; 
       // You must search cookies to find cookie named loginResult.CookieName and set its value to cookie variable; 
       cookie = cookies.Split(';').SingleOrDefault(c => c.StartsWith(loginResult.CookieName)); 
      } 
     } 

     HttpRequestMessageProperty httpRequestProperty = new HttpRequestMessageProperty(); 
     httpRequestProperty.Headers.Add(System.Net.HttpRequestHeader.Cookie, cookie); 
     using (new OperationContextScope(ug.InnerChannel)) 
     { 
      OperationContext.Current.OutgoingMessageProperties.Add(HttpRequestMessageProperty.Name, httpRequestProperty); 
      result = ug.GetGroupCollectionFromUser(LoginName).ToString(); 
     } 

и убедитесь в App.config AllowCookies свойства всех связывании быть ложными.

<basicHttpBinding> 
    <binding name="AuthenticationSoap" allowCookies="false"/> 
    <binding name="UserGroupSoap" allowCookies="false"/> 
</basicHttpBinding> 
+0

Спасибо @Kambiz Сайт Sharepoint использует проверку подлинности с помощью форм; Я могу увидеть свойство Url и другие свойства объекта Authentication Proxy, если я использую «Web Reference»; Я не вижу тех, у кого есть «Service Reference». Кажется, это моя главная проблема. – FMFF

+0

@FMFF Я имею в виду веб-приложение веб-служб SharePoint в IIS, а не сайты SharePoint, вы можете проверить его в IIS Manager.BTW, можете ли вы попробовать мой ответ и сообщить мне результат. –

+0

У нас отключен NTLM, включен анонимный доступ. Я попробовал ваше предложение и получил «Предоставленная схема URI« http »недействительна; ожидаемый «https». Имя параметра: via' – FMFF

1

Нечто подобное должно работать: (Взято/Под ред от http://social.msdn.microsoft.com/Forums/en-US/sharepointdevelopment/thread/b17ae5c8-f845-4cee-8298-c4f7b5c52b57)

Я думаю, вы должны использовать SPGroup, чтобы получить все группы с сайта и найти пользователя во всех группах:

Для одного пользователя и если вы знаете название группы, то вы можете попробовать с этим кодом:

SPWeb site = SPContext.Current.Web; 
SPGroup groupToQuery = site.Groups["Project"]; 
bool istrue = site.IsCurrentUserMemberOfGroup(groupToQuery); 

Если вы не знаете название группы, то попробуйте следующий код (это не проверено мной)

using (SPWeb rootWeb = topLevelSite.OpenWeb()) 
{ 
    foreach (SPGroup group in rootWeb.Groups) 
    { 
     bool isUserInGroup = IsUserInGroup(group, currentUser.LoginName); 
    } 
} 

private Boolean IsUserInGroup(SPGroup group, string userLoginName) 
{ 
    bool userIsInGroup = false; 

    try 
    { 
     SPUser x = group.Users[userLoginName]; 
     userIsInGroup = true; 
    } 
    catch (SPException) 
    { 
     userIsInGroup = false; 
    } 

    return userIsInGroup; 
} 
+1

этот код использует объектную модель SharePoint и просто работает на сервере, FMFF хочет получить доступ к SharePoint через WebService, который не нужно запускать на сервере SharePoint. –