サーバーがインストールされているドメインの外部からプログラムで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コレクションにアクセスできます。以前に説明した修正の前にこれをテストしました。私はこれまでにテストしたこと以外に、プログラムによるアクセスとブラウザアクセスの違いは何だろうかと思います。
このコードを実行しているマシンからTFSサーバーにアクセスすることはできません。 TFS内の追加のセキュリティ/権限設定を確認する必要があります。私はこれがプログラミングの問題だとは思わない。 – qJake
@SpikeX:マシンからTFSサーバーにアクセスできます。私は必要なポートを開き、Impersonatorで使用したのと同じ資格情報を使ってWebブラウザからURIにアクセスできます。 Webクライアントが動作する場合、私のプログラムは同じ動作をすると期待していますが、そうではありません。私はプログラム(コレクションとプロジェクトリスト)に接続できたなら、私のプログラムで取り出すべき情報を見ることができます。私は、プログラミングのエラー(資格情報の不足または間違った初期化)とネットワーク/サーバーエラー(構成の問題)の間になぜそれがぼやけているかを見ることができます。 – Matthieu
私の次のばかげた質問はあなたのURIには 'http://'とポート番号が含まれているということですか? – qJake