2011-09-29 11 views
6

サーバーがインストールされているドメインの外部からプログラムでTFSサーバーにアクセスしようとしています。ドメイン外からTFS 2010にプログラムでアクセスする

public class ConnectByImplementingCredentialsProvider : ICredentialsProvider 
    { 
     public ICredentials GetCredentials(Uri uri, ICredentials iCredentials) 
     { 
      return new NetworkCredential("<DifferentKindOfUsernames>", "<Password>", "<DomainOrNot>"); 
     } 

     public void NotifyCredentialsAuthenticated(Uri uri) 
     { 
      throw new ApplicationException("Unable to authenticate"); 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      string _myUri = @"<serverUri>"; 

      ConnectByImplementingCredentialsProvider connect = new ConnectByImplementingCredentialsProvider(); 
      ICredentials iCred = new NetworkCredential("<DifferentKindOfUsernames>", "<Password>", "<DomainOrNot>"); 
      connect.GetCredentials(new Uri(_myUri), iCred); 

      TfsConfigurationServer configurationServer = 
           TfsConfigurationServerFactory.GetConfigurationServer(new Uri(_myUri), connect); 
      configurationServer.EnsureAuthenticated(); 


     } 
    } 

とバージョン:以前のバージョンの両方が混在する

class Program 
    { 
     static void Main(string[] args) 
     { 
      Uri tfsUri = new Uri("<serverURI>"); 
      TfsConfigurationServer _ConfigurationServer = new TfsConfigurationServer(tfsUri, new NetworkCredential("<DifferentKindOfUsernames>", "<Password>")); 
      CatalogNode projectCollectionCatalog = _ConfigurationServer.CatalogNode.QueryChildren(new[] { CatalogResourceTypes.ProjectCollection }, false, CatalogQueryOptions.None)[0]; 
     } 
    } 

別のバージョン:強制認証情報を使用して、

class Program 
    { 
     static void Main(string[] args) 
     { 
      Uri tfsUri = new Uri("<serverUri>"); 
      TfsConfigurationServer _ConfigurationServer = TfsConfigurationServerFactory.GetConfigurationServer(tfsUri); 
      CatalogNode projectCollectionCatalog = _ConfigurationServer.CatalogNode.QueryChildren(new[] { CatalogResourceTypes.ProjectCollection }, false, CatalogQueryOptions.None)[0]; // actual connection tries to happen here 
     } 
    } 

別のバージョン:基本的なテストプログラムは次のようになります。アクティブなディレクトリでImpersonator

class Program 
    { 
     static void Main(string[] args) 
     { 
      using (new Impersonator("<DifferentKindOfUsernames>", "<DomainOrNot>", "<Password>")) 
      { 
       Uri tfsUri = new Uri("<serverUri>"); 
       TfsConfigurationServer _ConfigurationServer = TfsConfigurationServerFactory.GetConfigurationServer(tfsUri); 
       CatalogNode projectCollectionCatalog = _ConfigurationServer.CatalogNode.QueryChildren(new[] { CatalogResourceTypes.ProjectCollection }, false, CatalogQueryOptions.None)[0]; // actual connection tries to happen here 
      } 
     } 
    } 

serverURIは、http://<servername>:8080/tfsまたはhttp://<serverip>:8080/tfs(どちらもテスト済みでホストファイルは最新のもの)の形式で、TFSサーバーの通知URLとして設定されています。このプログラムはドメイン内で動作します。

DifferentKindOfUsernamesは、 'DOMAIN \ Username'、 'LocallyDuplicatedUsername'、 'LOCALMACHINE \ Username'から適切なパスワードを使用し、ドメインとマシンで同じパスワードを使用します。

この単純なアクセスは、ドメインの外に動作しません、と私はこのエラーがあります:

TF30063: You are not authorized to access <serverUri> 

は(asp.netのウェブサイトで同じプロセスを使用して)Webコンテキストで翻訳を、それがあります401エラー:私は実行して、ローカルユーザ/パスワードとの間のマッピングを持っている

  • The remote server returned an error: (401) Unauthorized. 
    

    も、(物事がこれまでテストした)場合ドメインの外部者マシン上のプログラムとTFSへの管理者権限を持つアクティブディレクトリアカウント(TFSの偽装権を持っていても)。

  • 私はと記載されているように、ドメインの外部者のマシン名とIPを持つBackConnectionNamesレジストリキーを追加します。
  • hereのようにループバックチェックを無効にします。
  • ユーザー/ドメインまたはマシン名の組み合わせが異なるActive Directory Impersonatorを使用します。 Active Directoryの偽装者はhereと記載されています。
  • hereのようなドメインアウトサイダーサーバーのIEセキュリティオプションでローカルインターネットゾーン(信頼済みサイトも試しました)にTFSサーバーIPを追加しました。

ブラウザからserverURIへのアクセスをテストしました。 uriは動作し、DomainName \ User + Passwordで資格情報を渡すとTFSコレクションにアクセスできます。以前に説明した修正の前にこれをテストしました。私はこれまでにテストしたこと以外に、プログラムによるアクセスとブラウザアクセスの違いは何だろうかと思います。

+0

このコードを実行しているマシンからTFSサーバーにアクセスすることはできません。 TFS内の追加のセキュリティ/権限設定を確認する必要があります。私はこれがプログラミングの問題だとは思わない。 – qJake

+0

@SpikeX:マシンからTFSサーバーにアクセスできます。私は必要なポートを開き、Impersonatorで使用したのと同じ資格情報を使ってWebブラウザからURIにアクセスできます。 Webクライアントが動作する場合、私のプログラムは同じ動作をすると期待していますが、そうではありません。私はプログラム(コレクションとプロジェクトリスト)に接続できたなら、私のプログラムで取り出すべき情報を見ることができます。私は、プログラミングのエラー(資格情報の不足または間違った初期化)とネットワーク/サーバーエラー(構成の問題)の間になぜそれがぼやけているかを見ることができます。 – Matthieu

+0

私の次のばかげた質問はあなたのURIには 'http://'とポート番号が含まれているということですか? – qJake

答えて

4

接続を確立するために資格情報を渡していません。これは、ドメイン外のホストから現在ログインしている資格情報を使用していることを意味します。私はWindows認証の専門家ではありませんが、特定の状況では、ユーザー名とパスワードが同一であれば透過的に動作しますが、使用されているNTLMのバージョン、クライアントとサーバーのオペレーティングシステム、信頼関係とセキュリティゾーン、IISの構成、おそらく月の段階です。言い換えれば

、あなたはおそらく接続に資格情報を渡したい:強くあなたが信頼できない(パブリック)を介してサーバーに接続している場合はSSL/TLSを有効にすることをお勧めしますことを

TfsConfigurationServer _ConfigurationServer = new TfsConfigurationServer(uri, new NetworkCredential("username", "password", "DOMAIN")); 

注意ネットワーク。

(私はNetworkCredentialのための三引数のコンストラクタを使用するために、これを修正 - 。私のミスをあなたが注意として、あなたはNetworkCredentialのにusername引数にDOMAIN\usernameを置けば、それは\DOMAIN\usernameの代わりDOMAIN\usernameとして扱います。この、私は。それでは、誰も私にC#コードを書くことができない理由を考えてみましょう。)

+0

まだ動作しません。 TFSのためにユーザーを偽装する方法はたくさんありますが、そのうちのいくつかを成功なしにテストしました。これは同じTF30063エラーを与えます。これまでテストしたさまざまなバージョンのコードを表示するために質問を更新します。 – Matthieu

+0

編集のおかげで、これははるかに明確です。カタログデータを照会しようとするのではなく、tfs.ensureAuthenticated()を呼び出すとどうなりますか?私はまだあなたがエラーを取得すると思いますか? –

+0

はい同じエラーです。私はいくつかのネットワーク分析を行ってきました。私はあなたのコメントに結果に答えます。 – Matthieu