首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何检测我的代码是否应该模拟?

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

Stack Overflow用户
提问于 2012-05-02 00:37:51
回答 4查看 1.2K关注 0票数 16

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

  • 以有权访问Tridion的身份运行(例如,COM+应用程序在MTSUser下运行,这是Tridion的身份,但允许模拟Tridion用户(例如,TcmServiceHost以NetworkService身份运行,配置为Tridion模拟用户)。

我尝试用下面的TOM.NET代码来满足这两种情况:

代码语言:javascript
复制
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”检查?

Tridion :当我使用核心服务访问时,同样的问题也会出现,所以问题不是TOM.NET是否适合在这里使用。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-05-02 20:35:35

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

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

代码语言:javascript
复制
var isImpersonationUser = IsImpersonationUser(WindowsIdentity.GetCurrent());
var session = isImpersonationUser ? new Session("Administrator") : new Session();
var item = session.GetObject(id);

或者,您可以为您的事件代码单独配置它。或者甚至是硬编码,如果你不关心代码的泛型的话。

票数 6
EN

Stack Overflow用户

发布于 2012-05-02 01:29:04

这段代码对我来说似乎相当有效--但是检查你是否可以创建session对象并不能保证代码能够执行你想要在CMS中实际执行的操作。

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

票数 2
EN

Stack Overflow用户

发布于 2012-05-02 21:59:30

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

我认为您正在尝试“构建”一些可以在每个Tridion过程中工作的通用程序。在我看来,您应该知道您何时处于一个或另一个进程中,因为根据最佳实践(R&D/ you ),我们不应该创建Session对象,而是在那些无法访问Session对象的进程中使用Core Service,并在可能的情况下重用可用的session。

例如,在模板和事件系统中,我们可以访问会话,所以我们应该重用它(除非我们想做用户不允许做的事情,在这种情况下,我们应该模拟)。

如果在另一个进程中会话不可用,您应该使用核心服务。

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

我理解你在这里试图识别的是什么,“谁在运行我当前的进程”?因此您可以相应地模拟,

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

希望这是有意义的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10400989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档