繁体   English   中英

无法打破Team Foundation Server 2010 Web Access中的模拟

[英]Unable to break impersonation in Team Foundation Server 2010 Web Access

我正在尝试使用TFS事件订阅服务通过Web界面动态创建订阅。 订阅将转到一个中间帐户。 为了我们的目的,我们将这两个帐户称为“非管理员用户”和“订阅存储”。

管理员可以为“订阅存储”帐户创建警报,订阅存储帐户可以为其本身创建警报,但是非管理员用户无法在存储帐户中创建订阅。 我收到以下错误消息:

拒绝访问:{用户帐户名}需要对资源$ SUBSCRIPTION具有以下权限:执行此操作:编辑

我使用的代码是:

IEventService eventService = (IEventService)this.tfsCollection.GetService(typeof(IEventService));
eventService.SubscribeEvent(userAccountIdentity.Sid, Strings.WorkItemChangedEvent, string.Format(Strings.Condition0, workItem.ToString(CultureInfo.InvariantCulture)), deliveryPreference, string.Format(Strings.AlertTag0, workItem.ToString(CultureInfo.InvariantCulture)));

请相信所有参数都是正确的,并且它们的值与该讨论无关。 :) tfsCollection是一个TfsTeamProjectCollection对象,它来自页面的Connection.TeamProjectCollection属性。

我的第一个想法是破坏模拟,以便它使用服务帐户(在本例中为NetworkService),因此我制作了一个扩展方法,该方法采用一个Action并在没有模拟的情况下执行该Action ,如下所示:

    public static void WithoutImpersonation(this Action actionToPerform)
    {
        using (var ctx = WindowsIdentity.Impersonate(IntPtr.Zero))
        {
            try
            {
                actionToPerform();
            }
            finally
            {
                ctx.Undo();
            }
        }
    }

这会在Action期间正确地中断模拟(检查WindowsIdentity.GetCurrentUser()返回NetworkService帐户而不是用户帐户),但仍无法创建具有相同错误的事件订阅。 TfsTeamProjectCollection经过身份验证的用户也是NetworkService帐户。

我解决了! 原来我是用错误的方式来处理它。 在实例化类的页面上,我必须使用EnterTfsImpersonationContext ,然后查找存储帐户的标识并为该帐户创建一个新的TfsTeamProjectCollection 那解决了问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM