2012-03-14 4 views
7

TFSで作業項目を追加するASP.NETページを作成しようとしています。IIS7偽装がTFSリポジトリにアクセスできない

私は偽装とWindows認証を有効にしている:ページで

<authentication mode="Windows" /> 
<identity impersonate="true" password="" userName="" /> 
<customErrors mode="Off" /> 

を、私はTFSにアクセスし、作業項目を追加しよう:しかし

TfsTeamProjectCollection prjCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri("xxx")); 
WorkItemStore store = prjCollection.GetService<WorkItemStore>(); 
... 

を私はを選択すると、それだけで動作しますSpecificUserASP.NET偽に設定し、資格情報を格納します。 認証済みユーザーが選択されていると機能しません。

SpecificUserが認証されたユーザーと同じであることを確認しましたが、後者の場合(偽装が正しく機能しないことを示す)、権限エラーが発生します。

TF30063: You are not authorized to access XXX. ---> System.Net.WebException: The remote server returned an error: (401) Unauthorized. 
    at System.Net.HttpWebRequest.GetResponse() 
    at  Microsoft.TeamFoundation.Client.TeamFoundationClientProxyBase.AsyncWebRequest.ExecRequest(Object obj) 
    --- End of inner exception stack trace --- 
    at  Microsoft.TeamFoundation.Client.TeamFoundationClientProxyBase.ProcessHttpResponse(HttpWebResponse response, Stream responseStream, WebException webException, XmlReader& xmlResponseReader) 
    at Microsoft.TeamFoundation.Client.TeamFoundationClientProxyBase.ExecWebServiceRequest(HttpWebRequest request, XmlWriter requestXml, String methodName, HttpWebResponse& response) 
    at Microsoft.TeamFoundation.Framework.Client.LocationWebService.Connect(Int32 connectOptions, ServiceTypeFilter[] serviceTypeFilters, Int32 lastChangeId) 
    at Microsoft.TeamFoundation.Framework.Client.FrameworkServerDataProvider.Connect(ConnectOptions connectOptions) 
    at Microsoft.TeamFoundation.Framework.Client.FrameworkServerDataProvider.EnsureConnected(ConnectOptions optionsNeeded) 
    at Microsoft.TeamFoundation.Framework.Client.FrameworkServerDataProvider.get_InstanceId() 
    at Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItemStore.InitializeInternal() 
    at Microsoft.TeamFoundation.Client.TfsTeamProjectCollection.InitializeTeamFoundationObject(String fullName, Object instance) 
    at Microsoft.TeamFoundation.Client.TfsConnection.CreateServiceInstance(Assembly assembly, String fullName) 
    at Microsoft.TeamFoundation.Client.TfsConnection.GetService(Type serviceType) 
    at Microsoft.TeamFoundation.Client.TfsConnection.GetService[T]() 
    at ASP.index_aspx.__Render__control1(HtmlTextWriter __w, Control parameterContainer) 

次の変数は、両方のケースのために同じように見える:

HttpContext.Current.Request.LogonUserIdentity.Name 
HttpContext.Current.Request.IsAuthenticated 
HttpContext.Current.User.Identity.Name 
System.Environment.UserName 
System.Security.Principal.WindowsIdentity.GetCurrent().Name 

任意のアイデア?

EDIT:ジョンは、後述するように

実際、問題はKerberosの委任によって引き起こされます。

Kerberos Delegation

私が説明すると、この軽減に非常に有用で次の記事とそれに付随するツールを見つけた:IISアプリケーションのためのアプリケーションプールで

DelegConfig - A Tool To help resolve Kerberos authentication and delegation issues

Kerberos Delegation Check

答えて

7

あなたは"double hop"問題があると思います。

+0

+1 ... ifs上のWebアプリケーションとして「別のマシン」に、tfsとのインタフェースを持つWebベースのuiツールのセットをデプロイしました。私はこの記事で説明したのと同じ行動を観察しています。既知の回避策?前もって感謝します。 – culturalanomoly

+0

うん。私の答えで "ダブルホップ"リンクをクリックしてください。 –

0

として実行?デフォルトでは、IIUSRアカウントの1つであり、必ずしもTFSサーバーの資格情報を持つドメインアカウントであるとは限りません。

+0

これは既定のApplicationPoolIdentityを使用していますが、そのため、偽装を有効にしているため、ユーザーの資格情報でTFSにアクセスできます。 –

2

this記事に基づいて、それはEnsureAuthenticated();

TfsTeamProjectCollection prjCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri("xxx")); 
prjCollection.EnsureAuthenticated(); 
WorkItemStore store = prjCollection.GetService<WorkItemStore>(); 

を追加するために、ショットの価値がある私が今までにこれを試していないので、私はそれだけちゃうの仕事を期待することができます。

関連する問題