【问题标题】:Connecting to TfsTeamProjectCollection fails due to Application Pool Identity由于应用程序池标识,连接到 TfsTeamProjectCollection 失败
【发布时间】:2016-12-14 10:32:05
【问题描述】:

我有 ASP.Net 应用程序,它使用 TFS API 并在域下工作。问题是本地一切正常。部署到配置为使用 ApplicationPoolIdentity 的 IIS 后,我的应用程序给我 500 Internal Server Error。当我将 Identity 设置为使用我的用户名和密码时,一切正常。应用使用Windows认证,被多个用户使用。

我们正在向 TFS 提交数据,如果将身份配置为我的用户名,则在 TFS 历史记录中它显示我已经修改了该项目。我们需要它是实际进行修改的用户。

之前在某些地方,比如“Assigned To”或“Deployed By”,我使用过

var currentDisplayName = System.DirectoryServices.AccountManagement.UserPrincipal.Current.DisplayName;

发现这个问题后,用

解决了
var currentDisplayName = System.Web.HttpContext.Current.User.Identity.Name;

但是当我使用 Identity - ApplicationPoolIdentity 时,应用程序无法运行的问题。

我获得团队项目集合的方法:

var tfsTeamProjectUrl = ConfigurationProvider.TfsTeamProjectUrl;
        var teamProjectCollection = new TfsTeamProjectCollection(new Uri(tfsTeamProjectUrl));
        teamProjectCollection.EnsureAuthenticated();
        return teamProjectCollection;

在本地这工作正常,但在 IIS 上,它想使用来自 IIS 应用程序池的身份,但我需要它使用来自实际用户的凭据。

更新 我试图通过这样做来模拟实际用户:

        var tfsTeamProjectUrl = ConfigurationProvider.TfsTeamProjectUrl;

        var baseUserConnection = new TfsTeamProjectCollection(new Uri(tfsTeamProjectUrl));
        var ims = baseUserConnection.GetService<IIdentityManagementService>();
        var username = System.Web.HttpContext.Current.User.Identity.Name;

        var identity = ims.ReadIdentity(IdentitySearchFactor.AccountName, username,
            MembershipQuery.None, ReadIdentityOptions.None);

        var teamProjectCollection = new TfsTeamProjectCollection(new Uri(tfsTeamProjectUrl), identity.Descriptor);
        teamProjectCollection.EnsureAuthenticated();
        return teamProjectCollection;

但现在我开始了

Microsoft.TeamFoundation.Client.dll 中出现“Microsoft.TeamFoundation.TeamFoundationServerInvalidResponseException”类型的异常,但未在用户代码中处理 附加信息:请联系您的管理员。联系服务器时出错。 技术信息(针对管理员): HTTP 代码 500:内部服务器错误

【问题讨论】:

标签: c# asp.net iis tfs


【解决方案1】:

似乎 IIS 决定尝试使用应用程序池标识而不是您明确提供的凭据来访问 TFS。您正在对服务器进行身份验证,但随后不使用服务器对象,因此应用程序正在恢复到它运行时的任何身份。

尝试使用以下代码进行身份验证:

string tfsServerUrl = "http://servername:8080/tfs";
System.Net.NetworkCredential tfsCredential = new System.Net.NetworkCredential("ServiceAccountName", "password", "DOMAIN");
TfsConfigurationServer tfs =  new TfsConfigurationServer(new Uri(tfsServerUrl), tfsCredential);
tfs.Authenticate(); 

【讨论】:

  • 这很好用,我已经试过了,但是如果我这样连接,部分问题仍然存在。我需要设置它,因为凭据是使用来自连接到应用程序的实际用户的信息,而不是硬编码的信息。因为在历史上的 TFS 中,它仍然会显示错误的人进行了更改。,
  • 使用 NetworkCredential 例如var _credentials = new NetworkCredential(UserName, Password); 不会弹出一个允许用户键入和输入他们的用户名和密码的窗口吗?在Server中部署项目时使用Windows身份验证会出现“You are not authorized to access”之类的错误social.msdn.microsoft.com/Forums/vstudio/en-US/…
  • 正如 nschonni 评论的那样,Double-Hop 可能是根本原因。该问题与您的代码无关。我也找了一篇相关文章供大家参考:stackoverflow.com/questions/4013081/…
猜你喜欢
  • 2015-12-17
  • 1970-01-01
  • 2011-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-25
  • 1970-01-01
相关资源
最近更新 更多