所以我正在尝试开发一个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身份验证。所有其他auth选项都被禁用。
答案 0 :(得分:0)
我使用这段代码模拟WCF服务:
/// <summary>
/// Impersonation - Creates new instance of TfsTeamProjectCollection object using a different user;
/// </summary>
/// <param name="serverUri">Tfs server uri you want to connect using Impersonation</param>
/// <param name="userToImpersonate">Account name of the user you want to Impersonate</param>
private void Impersonation(Uri serverUri, string userToImpersonate)
{
try
{
eventLog1.WriteEntry("Start Impersonation");
// Read out the identity of the user we want to impersonate
TeamFoundationIdentity identity = ims.ReadIdentity(IdentitySearchFactor.AccountName,
userToImpersonate,
MembershipQuery.None,
ReadIdentityOptions.None);
eventLog1.WriteEntry(identity.DisplayName);
this.impersonatedTFSUser = new TfsTeamProjectCollection(serverUri, identity.Descriptor);
eventLog1.WriteEntry(impersonatedTFSUser.Name);
eventLog1.WriteEntry("End Impersonation");
}
catch (Exception ex)
{
throw ex;
}
}
答案 1 :(得分:0)
在一些帮助下解决了这个问题。所以事实是,如果我使用TFS模拟,应用程序池需要与可以访问TFS的用户一起运行,而不是更多。我禁用了asp.net模拟,只启用了Windows Auth。此外,我将“身份”从应用程序池高级设置更改为我的TFS用户。 现在还有另一个问题。使用该Web应用程序的任何人只能看到他和我的用户都有权使用的项目。此外,在保存工作项时,TFS使用应用程序池标识(在本例中为我的用户)和运行应用程序的用户的“上次修改”自动填充“created by”字段。这不是我希望它如何工作,所以我将做更多的研究。