由于应用程序池标识,连接到TfsTeamProjectCollection失败

时间:2016-08-08 15:10:30

标签: c# asp.net iis tfs

我有ASP.Net应用程序,它使用TFS API并在Domain下工作。问题是本地一切正常。部署到配置为使用ApplicationPoolIdentity的IIS后,我的应用程序给了我500内部服务器错误。当我设置身份使用我的用户名和密码时,一切正常。应用程序使用Windows身份验证,并由多个用户使用。

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

之前在某些地方,例如"分配给"或者"部署者"我用了

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 App Pools中的Identity,但我需要它来使用来自实际用户的凭据。

更新 我尝试通过这样做来冒充实际用户:

        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;

但现在我开始

  

类型&#39; Microsoft.TeamFoundation.TeamFoundationServerInvalidResponseException&#39;的例外情况发生在Microsoft.TeamFoundation.Client.dll但未在用户代码中处理   其他信息:请与您的管理员联系。联系服务器时出错。   技术信息(针对管理员):     HTTP代码500:内部服务器错误

1 个答案:

答案 0 :(得分:0)

似乎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();