如何检测我的代码是否应该模拟?

时间:2012-05-01 16:37:51

标签: tridion

我的代码是作为事件处理程序的一部分运行的,需要创建一个新的TOM.NET会话(我不能重用subject.Session)。此事件处理程序加载到许多Tridion进程(TcmServiceHost,COM +,Publisher,TcmTemplateDebugHost,IIS应用程序池)中,这些进程可能会:

  • 在可以访问Tridion的身份下运行(例如,COM +应用程序在MTSUser下运行,这是一个Tridion管理员)
  • 以无法访问Tridion的身份运行,但允许模拟Tridion用户(例如,TcmServiceHost运行为NetworkService,配置为Tridion模拟用户)。

我尝试使用此TOM.NET代码来满足这两种情况:

Session session = null;
try
{
    session = new Session();
}
catch (AccessDeniedException ex)
{
    // this process doesn't have TCM access, so impersonate a user that does
    session = new Session("Administator");
}
if (session != null)
{
    var item = session.GetObject(id);
    ...

这是检查我的代码是否在可以访问Tridion的进程下运行的正确方法(忽略我硬编码“Administrator”的事实)?代码有效,但我只是想知道是否有更有效的方法来执行“有权访问Tridion”检查?

注意:当我使用Core Service访问Tridion时会出现同样的问题,因此问题不在于TOM.NET是否适合在此处使用。

4 个答案:

答案 0 :(得分:6)

我不会使用此代码。异常捕获很慢,并且您当前正在授予(管理员)访问任何无法访问系统的人的权限 - 这是一个很大的安全漏洞。

相反,我会查看当前用户是谁,并确定他是否是模仿用户。如果没有API,我可以直接从Tridion.ContentManager.config文件中读取模拟用户(我没有检查过)。

var isImpersonationUser = IsImpersonationUser(WindowsIdentity.GetCurrent());
var session = isImpersonationUser ? new Session("Administrator") : new Session();
var item = session.GetObject(id);

或者您可以根据事件代码单独配置它。如果您不关心通用代码,甚至是硬编码。

答案 1 :(得分:2)

这段代码对我来说似乎非常有效 - 但通过检查是否可以创建会话对象,绝不能保证代码能够执行您想要在CMS中实际执行的操作。

似乎此类代码正在创建一个大型安全漏洞,允许进程在没有权限时回退到更高级别的安全性。另请注意,如果您要修改CMS中的任何项目,那么该模拟将导致不显示可能触发更改的个人的真实姓名。它将以您模仿的用户身份存储。

答案 2 :(得分:2)

首先,这是一个很好的问题/主题。

我认为您正在尝试“构建”可以在每个Tridion进程上运行的通用内容。在我看来,你应该知道你何时处于一个或另一个过程中,因为基于最佳实践(R& D / you),我们不应该创建Session对象,而是在那些没有创建会话对象的过程中使用核心服务。 t可以访问Session对象并尽可能重用可用的会话。

正如你在模板和事件系统中所知,我们可以访问Session,所以我们应该重用它(除非我们想做一些不允许用户做的事情,在这种情况下我们应该冒充) 。

如果在另一个进程中会话不可用,则应使用Core Service。

所以我对你的问题的回答是不使用TOM.NET。我会改变我的方法并使用核心服务构建它,我可以模拟我之前已经配置的特定用户。而且你的代码会更通用,并且会“无处不在”(不是在烤面包机中)。

我理解你在这里想要识别的是什么,“我的当前流程是谁?”所以你可以相应地冒充,

不幸的是(AFAIK)您必须编写一些代码来查看运行该进程的身份是谁,然后相应地进行模拟。这很棘手,这也是我建议使用核心服务而不是TOM.NET API的原因。

希望这是有道理的。

答案 3 :(得分:1)

当最初实现TDSE.Impersonate()方法时,如果调用线程标识不是模拟用户,则有意识地将其设计为静默失败。例如,这允许当天的GUI中的ASP代码盲目地尝试模仿(基于REMOTE_USER标题IIRC)。关键是,如果你不是模仿用户,好吧,没问题,你可以做你自己,但如果你是,你可以/冒充。

我刚用COM API对此进行了测试(我将留给您验证.NET API是否一致)。我的结果(在Tridion 2011 SP1上)如下:

1)。作为受托人并且没有冒充的模仿用户成为他自己。 2)。作为受托人和冒充的模仿用户成为他们冒充的人(N.B.您通常不希望创建这样的用户)。 3)。非模仿用户称自己是模仿者。

显然,很大程度上取决于流程标识是否是模仿用户。也许在某些情况下,您可能更愿意避免使用NETWORK SERVICE并明确地为TcmServiceHost创建标识,只是为了允许对这样的用户是否可以模拟进行细粒度控制。

那么......你是否需要明确地测试你的进程是否作为模仿者运行?简单地尝试模拟并接受结果可能更好。最初的想法肯定包含了这个意图,但我怀疑事情变得更加复杂。

+1这个问题,因为对于这个领域的预期行为毫无疑问是完全必要的。