【问题标题】:Tridion CoreService Authentication/ImpersonationTridion CoreService 身份验证/模拟
【发布时间】:2026-01-28 07:05:02
【问题描述】:

我开发了一个使用核心服务的 .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;

我遇到的问题是,当我调用核心服务时,我在 CMS 框中收到以下 Tridion Content Manager 错误:

用户 NT AUTHORITY\NETWORK SERVICE 的访问被拒绝。

如何配置我的客户端,以便使用 Tridion 服务帐户而不是 NT AUTHORITY\NETWORK SERVICE 执行操作?

【问题讨论】:

  • 嘿安德鲁,我看到你接受了我的回答。很高兴听到您的代码可以工作。你能告诉我们你最终做了什么吗?
  • @FrankvanPuffelen 没问题,我切换到 SessionAwareCoreServiceClient 并使用了 WsHttpBinding。不幸的是,即使错误消息的位置在调用我的 .Net 库的自动化工作流活动中列为 VbScript 中的行,但它实际上是由附加到 ProcessInstance 的事件引起的。我更改了事件中使用的会话来模拟解决权限问题的服务帐户。

标签: wcf tridion tridion-2011


【解决方案1】:

如果您想在服务帐户下运行,您可能应该使用SessionAwareCoreServiceClient,然后模拟您要使用的帐户。

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

但由于我的大多数核心服务客户端实际上是要在不同的机器上运行,我不能使用 Impersonate(至少在没有引入 huge 安全漏洞),所以我像这样初始化我的客户端:

var client = ...
var credentials = CredentialCache.DefaultNetworkCredentials;
if (!string.IsNullOrWhiteSpace(userName) && !string.IsNullOrWhiteSpace(password))
{
    credentials = new NetworkCredential(userName, password);
}
client.ChannelFactory.Credentials.Windows.ClientCredential = credentials;

【讨论】:

  • 谢谢。是否可以将 SessionAwareCoreServiceClient 与 BasicHttpBinding 一起使用?还是我需要使用不同的绑定类型?
  • 如果您可以通过 HTTP 使用 SessionAwareCoreServiceClient,它会以另一种方式受到保护(例如,通过检查流量是否来自本地主持人)。否则它肯定会带来一个有趣的安全挑战:这意味着运行在任何机器上并通过 HTTP 连接的代码可能会突然冒充管理员说 Impersonate("Administrator")。但可能是 SessionAwareCoreServiceClient 以另一种方式受到保护(例如,通过检查流量是否来自本地主机),所以如果我是你,我会尝试一下。
  • 我现在看到您希望从自动化工作流活动中运行代码,在这种情况下,如果这是使用 SessionAwareCoreServiceClient 的先决条件,您也可以使用 netTcp
  • HiFrank...因为此代码将在 Tridion 服务器上,用户将从那里的本地计算机访问自定义页面..那么用户名和密码将如何用于他在上面的代码中的登录,因为这是将从 web.config [ if (!string.IsNullOrWhiteSpace(userName) && !string.IsNullOrWhiteSpace(password)) ]...实际上我希望访问自定义页面的用户应该将他的详细信息放在 tridion 历史记录中在 tridion 中完成的操作...请建议
  • 我建议你打开一个新问题。还要记住,“请建议”虽然友好,但不是问题。如果您有问题,您需要一名培训师或聘请 SDL 或其合作伙伴的专家。如果您有一个清晰、定义明确的问题,并且可能有明确的答案,我们很乐意在 * 为您提供帮助。