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

Fra*_*len 16 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);
    ...
Run Code Online (Sandbox Code Playgroud)

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

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

Pet*_*aer 6

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

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

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

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