所以我正在尝试开发一个 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中,我设置了" 身份模拟= true",在iis中,我启用了 asp.net 模拟和Windows身份验证。所有其他身份验证选项均已禁用。
我正在使用这段代码在 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;
}
}
在一些帮助下解决了这个问题。因此,事实是,如果我使用 TFS 模拟,则应用程序池需要使用有权访问 TFS 的用户运行,并且仅此范围不超过此范围。我禁用了 asp.net 模拟,只启用了 Windows 身份验证。此外,我将"标识"从应用程序池高级设置更改为我的 TFS 用户。现在还有另一个问题。任何使用该 Web 应用程序的人都只能看到他和我的用户都有权访问的项目。此外,保存工作项时,TFS 会自动完成具有应用池标识(在本例中为我的用户)的"创建者"字段,并使用运行应用的用户自动完成"上次修改时间"字段。这不是我希望它的工作方式,所以我要做更多的研究。