TFS 2010 - Почему при олицетворении возникает ошибка «TF30063. У вас нет прав доступа». - PullRequest
5 голосов
/ 02 декабря 2011

Я пытаюсь создать ошибку в TFS2010, выдавая себя за пользователя, но всегда получаю

"TF30063 You are not authorized to access.."

Сначала я аутентифицируюсь с использованием учетной записи службы, а затем пытаюсь выдать себя за отдельную учетную запись пользователя,Я могу успешно создавать рабочие элементы, используя любую учетную запись как программно, так и в веб-интерфейсе.Однако, когда я пытаюсь создать рабочий элемент, используя олицетворенную учетную запись (в любом случае), я всегда получаю эту ошибку.Мой код:

public int Save(List<KeyValuePair<string, string>> values, ticketType type,string user)
    {
        // get the Uri to the project collection to use
        Uri  tfsuri = new Uri("http://94.23.12.119:8085/tfs");            

        // get a reference to the team project collection (authenticate as generic service account)
        using (var tfs = new TfsTeamProjectCollection(tfsuri, new System.Net.NetworkCredential("username", "password", "servername")))
        {
            tfs.EnsureAuthenticated();

            //Now get the details of the user we want to impersonate
            TeamFoundationIdentity identity = GetImpersonatedIdentity(tfsuri,tfs,user);

            //Now connect as the impersonated user
            using (TfsTeamProjectCollection ImpersonatedTFS = new TfsTeamProjectCollection(tfsuri, identity.Descriptor))
            {
                ImpersonatedTFS.EnsureAuthenticated();
                var workItemStore = GetWorkItemStore(ImpersonatedTFS);

                // create a new work item
                WorkItem wi = new WorkItem(GetWorkItemType(type, workItemStore));
                {
                    //Values are supplied as a KVP - Field Name/Value
                    foreach (KeyValuePair<string,string> kvp in values)
                    {
                        if (wi.Fields.Contains(kvp.Key))
                        {
                            wi.Fields[kvp.Key].Value = kvp.Value;
                        }
                    }

                    ValidationResult = wi.Validate();                       
                }

                if (ValidationResult.Count == 0)
                {

                    wi.Save();
                    return wi.Id;
                }
                else
                { 
                    return 0;
                }
            }
        }

    }

Он успешно получает олицетворенную личность, но переключается на

ImpersonatedTFS.EnsureAuthenticated();

Обе учетные записи имеют набор разрешений «Выполнять запросы от имени других».

Ответы [ 2 ]

1 голос
/ 21 мая 2013

Сначала позвольте мне сначала уточнить одну вещь. Кажется, ваше приложение является серверным приложением, и в этом случае нет смысла использовать EnsureAuthenticated().. Это всего лишь прием настройки производительности, чтобы помочь клиентам с пользовательским интерфейсом / настольным компьютером.

Теперь вернемся к вашей основной проблеме: - Если ваше приложение работает должным образом при локальном доступе, но не работает при удаленном доступе, тогда, пожалуйста, продолжайте читать, иначе это не решение для вас.

Причиной сбоя является то, что имя SPN необходимо добавить к учетной записи службы в активном каталоге. Для аутентификации Kerberos необходимо.

Это то, что команда TFS должна объяснить, потому что многие разработчики забудут об этом, сосредоточившись на своей работе. Надеюсь, это поможет.

Чтобы узнать больше об основах SPN и Kerberos, ознакомьтесь со следующими ресурсами:

Надеюсь, это поможет.

Спасибо!

0 голосов
/ 01 января 2012

Где у ваших пользователей установлен набор разрешений Make requests on behalf of others? На уровне коллекции проектов (доступ через Team > Team Project Collection Settings > Security..) или на уровне сервера TFS (доступ через Team Foundation Administration Console > Application Tier > Security..)?

Я думаю, что ваша проблема в том, что у вас есть разрешение на олицетворение только на уровне «Сервер», но вы пытаетесь олицетворять в коллекции.

Это то, что Тейлор говорит в своем Представлении олицетворения TFS в блоге:

Это разрешение включено в каждую коллекцию командных проектов. и внутри сервера конфигурации. Это означает, что если пользователь А имеет это разрешение на TPC1 он не будет выдавать себя за пользователей при разговоре с TPC2 или сервером конфигурации. Аналогично, если пользователь B имеет это разрешение на сервере конфигурации она не сможет выдавать себя за пользователя при общении с любой из коллекций командного проекта .

...