在 C#、asp.net、Windows 标识中模拟

本文关键字:标识 Windows 模拟 net asp | 更新日期: 2024-10-24 22:23:48

所以我正在尝试开发一个 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身份验证。所有其他身份验证选项均已禁用。

在 C#、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 会自动完成具有应用池标识(在本例中为我的用户)的"创建者"字段,并使用运行应用的用户自动完成"上次修改时间"字段。这不是我希望它的工作方式,所以我要做更多的研究。