[英]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.