【发布时间】:2016-04-21 07:40:25
【问题描述】:
所以我正在尝试开发一个 Web 应用程序(c#,asp.net 4.5),它使用 Windows 身份和模拟连接到 TFS(团队基础服务器)并检索一些元素(工作项、任务等)。问题是模拟仅适用于运行应用程序的服务器,仅适用于我的身份。每当其他人尝试连接时,他们的访问被拒绝,应用程序崩溃一个未经授权的错误“TF30063:您无权访问[服务器地址]”。当然,其他人是经过授权的,因为他们可以直接访问 TFS(但不是通过我的应用程序),其中一些人是管理员。
返回错误的那段代码就是这个
protected TfsTeamProjectCollection TeamProjectCollection
{
get
{
if (tpc == null)
{
// I HAVE ALSO TRIED THIS COMMENTED OUT PART, TOO. Still doesn't work.
// using (WindowsIdentity.GetCurrent().Impersonate())
// {
// tpc = new TfsTeamProjectCollection(new Uri(ConnectionString));
// }
var identityDescriptor = Microsoft.TeamFoundation.Framework.Client.IdentityHelper.CreateDescriptorFromSid(WindowsIdentity.GetCurrent().User);
tpc = new TfsTeamProjectCollection(new Uri(ConnectionString), identityDescriptor);
}
return tpc;
}
}
有没有其他人遇到过这种情况?我花了几天时间研究网络,但没有找到有效的答案。希望大家能帮忙! 其他提及:在 web.config 中我设置了“identity impersonate = true”,在 iis 中我启用了 asp.net 模拟和 Windows 身份验证。所有其他身份验证选项都被禁用。
【问题讨论】:
-
我认为您需要使用
HttpContext.Current.User.Identity而不是WindowsIdentity.GetCurrent()。 -
不,抱歉。我希望它是那么简单。您不能将 httpcontext.cu... 传递给描述符。它接受一个必须是 sid 的参数,因此它不是有效类型。刚试过这个。还是谢谢。
-
我没有提供正确的答案,因为我不确定细节。但是,我很确定
WindowsIdentity.GetCurrent()是 IIS 工作进程使用的身份,它是一个服务帐户,而不是您在访问 TFS 时想要使用的身份。HttpContext.Current.User.Identity为您提供当前用户(浏览器中的用户)的身份,您需要将其转换为 TFS 以某种方式使用的所需形式。如果您需要 SID 并且只有DOMAIN\USER这样的用户名,则需要将该用户名映射到代码中的 SID。
标签: c# asp.net tfs asp.net-identity impersonation