Аутентификация / Олицетворение 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;