0

ここでは私の問題の背景を説明します。クライアントが使用するいくつかのタブレットにサイドロードされるWindowsストアアプリケーションを開発しています。このタブレットアプリケーションは、Web APIを呼び出して、リポジトリ(EntityFramework経由のSQL Server)でCRUD操作を行います。すべてがWindows認証を使用する必要があります。タブレットは、Windows 10を実行しているDellです。各ユーザーは、独自のアクティブなドメイン資格情報でログインします。タブレットは資格情報をWeb APIに渡し、Web APIはリポジトリ(データベース)にそれらを渡します。資格情報に基づいて、リポジトリはユーザーが所属するグループを決定し、それに基づいて、ユーザーがアクセスできるリソースにアクセスできるようにします。Windows認証を使用してWindowsストアアプリケーションからWeb APIを呼び出す

私のWeb APIは正常に動作します。私はFiddlerでテストしました。 HTTP GETリクエストでは、私はテストしたい、私は "自動認証"チェックボックスをチェックし、3つの連続したメッセージを見ることができます。最初の2つは401で返され、3番目のHTTPコード200はリクエストしたデータと共に返されます。

しかし、Windowsストアアプリから呼び出そうとすると、最初のGETリクエストのみを送信します。私のWeb APIはIIS Expressでホストされています。このグループの非常に異なるメンバーの助言を得て、私は "localhost"ではなく、自分の開発マシンのIPアドレスを使ってWeb APIを公開するようにIIS Expressを設定しました。これを行う前に、私はGET Requestsがサーバーに当たっているのを見ていません。

Windows認証でNTLMスキームが使用され、ネゴシエーションプロセスが必要なので、Fiddlerが最初にサーバーに送信する3つのメッセージが必要ですか?

このネゴシエーションを回避するには、どのようにWeb APIクライアントコードを記述する必要がありますか?私は午前と午後に問題を解決するために午前と午後を過ごしましたが、ここや他の多くのウェブサイトでは、どういうわけか、私はまだそれを動作させませんでした。私は何かを逃しているに違いないと私は何がわからない。

var authHandler = new HttpClientHandler() 
{ 
    Credentials = CredentialCache.DefaultNetworkCredentials, 
    ClientCertificateOptions = ClientCertificateOption.Automatic 
}; 

var webApiClient = new HttpClient(authHandler) 
{ 
    BaseAddress = new Uri(_serviceUri), // _serviceUri is a string that looks like this "http://10.120.5.201:53045" 
}; 

webApiClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

HttpResponseMessage response = await webApiClient.GetAsync("api/user"); 

私の呼び出しはGetAsyncから返すことはありませんが、フィドラーでは、私は最初のGET要求がサーバーにポストされて見ることができます:ここでのWeb APIクライアント側での私のコードです。 Fiddlerと同じように、私のクライアントに舞台裏でフォローアップをさせ、残りの2つのメッセージを送信すると、最終的に応答HTTP 200コードとFiddlerで受け取ったデータが返されます。

誰かが正しい方向に向けることができれば、私は非常に感謝しています。

答えて

0

問題は、アプリのPackage.appxmanifestファイルの[Capabilities]タブで[Enterprise Authentication]設定が設定されていないことでした。それが問題であることを理解するまでにはしばらく時間がかかりましたが、私がチェックしたところで、私のアプリはWindows認証を使い始めました。

関連する問題