2012-05-07 4 views
1

Я потратил часы на странную «ошибку» в отношении веб-метода от веб-службы .NET, запрашивающей права пользователя информации AD.Sharepoint RunWithElevatedPrivileges vs Imersonation

Хорошей новостью является исправление ошибки, но я бы понял, почему коррекция эффективна.

Веб-метод с ошибкой является следующая:

public bool ValidateTask(string originatingUser) 
{ 
    SPUserToken userToken = null; 

    // get the System account for impersonation 
    string userToken = site.SystemAccount.UserToken; 
    using (SPSite rootSite = new SPSite(site.ID, userToken)) 
    { 
     using (SPWeb web = rootSite.OpenWeb()) 
     { 
      // get the domain name of the application pool of the web app 
      string servicesDomain = 
       StringUtilities.GetDomain(site.WebApplication.ApplicationPool.ManagedAccount.Username); 
      // get the domain name of the user 
      string accountsDomain = StringUtilities.GetDomain(originatingUser); 

      PrincipalContext ServicesDomainContext = 
       new PrincipalContext(ContextType.Domain, servicesDomain); 
      PrincipalContext AccountsDomainContext = 
       new PrincipalContext(ContextType.Domain, accountsDomain); 

      // COMException when the FindByIdentity is called because 
      // AccountsDomainContext.connectedServer throw exception 
      using (UserPrincipal usr = 
       UserPrincipal.FindByIdentity(AccountsDomainContext, IdentityType.SamAccountName, originatingUser)) 
      { 
      // get user groups memberships 
      } 
     } 
     // check groups memberships and return the true or false 
    } 
} 

Веб-метод с коррекцией заключается в следующем:

======== ================================================== =================

В sharepoint, я думал, что Imperso и RunWithElevatedPrivilege произведет тот же результат. So Мои вопросы ares:

1 - Почему работает RunWithElevatedPrivilege?

2 Что такое учетные данные, когда мы повышаем привилегии в контексте WebMethod? Это учетная запись пула идентификаторов корней SharePoint Web Services?

3- Мы можем проследить учетные данные двух методов?

ответ

1

RunWithElevatedPrivileges запускает код внутри в новом потоке. Этот новый поток работает под учетной записью текущего пула приложений. Если вы его вызываете, например. под http://localhost/_vti_bin/yourservice пул приложений представляет собой приложение веб-приложения на порту 80. Использование нового SPSite с токеном пользователя открывает только SPSite в контексте определенного пользователя и не запускает новый поток. Вы можете отслеживать текущего пользователя, вызывая WindowsIdentity.Current

+0

Thx для ответа. Мой файл asmx находится в папке шаблона \ layouts, а dll находится в GAC. Пользовательский токен - это учетная запись «sharepoint \ system». Но когда мы выдаем себя за новый SPSite (siteId, usertoken), у нас есть полные права в контексте sharepoint, но когда мы выполняем запросы в AD (или файловой системе), WindowsIdentity по-прежнему является текущим пользователем, вызывающим веб-службу. Вот почему RunWithElevatedPrivileges более мощный из-за новой Thread с ApplicationPoolidentity. – user1380787

Смежные вопросы