2012-07-04 2 views
0

Я пытаюсь использовать службу подписки на события TFS для динамического создания подписки через веб-интерфейс. Подписки идут на промежуточную учетную запись. Для наших целей мы будем называть две учетные записи «пользователями без права администратора» и «хранилищем подписки».Не удалось разблокировать олицетворение в Team Foundation Server 2010 Веб-доступ

Администратор может создать предупреждение для учетной записи «Подписка на подписку», а учетная запись хранения подписки может создавать оповещения для себя, но пользователь, не являющийся администратором, не может создавать подписки в учетной записи хранилища. Я получаю следующее сообщение об ошибке:

Access Denied: {имя пользователя учетной записи} необходимо следующее разрешение (ы) на ресурс $ подписка: для выполнения этого действия: Редактировать

код, который я» м, используя это:

IEventService eventService = (IEventService)this.tfsCollection.GetService(typeof(IEventService)); 
eventService.SubscribeEvent(userAccountIdentity.Sid, Strings.WorkItemChangedEvent, string.Format(Strings.Condition0, workItem.ToString(CultureInfo.InvariantCulture)), deliveryPreference, string.Format(Strings.AlertTag0, workItem.ToString(CultureInfo.InvariantCulture))); 

Пожалуйста, принять на веру, что все параметры верны, и что их значения не имеют никакого отношения к этому обсуждению. :) tfsCollection - это объект TfsTeamProjectCollection, который исходит из свойства Connection.TeamProjectCollection страницы.

Моя первая мысль была разорвать олицетворения так, что он использует учетную запись службы (в данном случае, NetworkService), так что я сделал метод расширения, который принимает Action и выполняет его без олицетворения, следующим образом:

public static void WithoutImpersonation(this Action actionToPerform) 
    { 
     using (var ctx = WindowsIdentity.Impersonate(IntPtr.Zero)) 
     { 
      try 
      { 
       actionToPerform(); 
      } 
      finally 
      { 
       ctx.Undo(); 
      } 
     } 
    } 

Это правильно нарушает олицетворение на протяжении Action (проверка WindowsIdentity.GetCurrentUser() возвращает учетную запись NetworkService вместо учетной записи пользователя), но по-прежнему не удается создать подписку на события с той же ошибкой. Авторизованным пользователем TfsTeamProjectCollection является также учетная запись NetworkService.

ответ

1

Я решил это! Оказывается, я приближался к нему неправильно. На странице, создающей экземпляр моего класса, мне пришлось использовать EnterTfsImpersonationContext, а затем посмотреть личность учетной записи хранилища и создать новую учетную запись TfsTeamProjectCollection. Это решило проблему.