Аутентификация / Олицетворение Tridion CoreService

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

Я смог успешно подключиться к сервису, используя сервисную учетную запись, которая у нас есть для Tridion:

CoreServiceClient client = new CoreServiceReference.CoreServiceClient(
                                                       binding, endpoint);
client.ChannelFactory.Credentials.Windows.ClientCredential = 
        new NetworkCredential(serviceAccountUsername, serviceAccountPassword);
client.ChannelFactory.Credentials.Windows.AllowedImpersonationLevel = 
        System.Security.Principal.TokenImpersonationLevel.Delegation;

С соответствующими атрибутами привязки, установленными как следующие:

binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
binding.Security.Transport.ClientCredentialType = 
        HttpClientCredentialType.Windows;

Проблема, с которой я сталкиваюсь, заключается в том, что когда я выполняю вызовы в базовую службу, я получаю следующую ошибку Tridion Content Manager в окне CMS:

Доступ запрещен для пользователя NT AUTHORITY\NETWORK SERVICE.

Как я могу настроить мой клиент так, чтобы операции выполнялись с использованием учетной записи службы Tridion вместо NT AUTHORITY\NETWORK SERVICE?

1 ответ

Решение

Если вы хотите работать под учетной записью службы, вы, вероятно, должны использовать SessionAwareCoreServiceClient а затем выдать себя за учетную запись, которую вы хотите использовать.

var client = new SessionAwareCoreServiceClient(binding, endpoint);
client.Impersonate("Administrator");

Но так как большинство моих клиентов Core Service на самом деле предназначены для работы на другой машине, я не могу использовать Impersonate (по крайней мере, без большой утечки безопасности), поэтому вместо этого я инициализирую своих клиентов следующим образом:

var client = ...
var credentials = CredentialCache.DefaultNetworkCredentials;
if (!string.IsNullOrWhiteSpace(userName) && !string.IsNullOrWhiteSpace(password))
{
    credentials = new NetworkCredential(userName, password);
}
client.ChannelFactory.Credentials.Windows.ClientCredential = credentials;
Другие вопросы по тегам