2017-11-06 14 views
0

API管理を使用してクライアント(例:ネイティブコンソールアプリケーション)からAPIを呼び出すと、User.Identity.Nameは空になり、IsAuthenticatedはバックエンドAPIではFalseです。Azure API Managementを介してAPIを呼び出すと、User.Identity.Nameが空になる

API管理ポータルのWebページ(Try Itテストポータル)を使用してAPIを呼び出すと、サーバー側のAPIコードでUser.Identity(User.Identity.Name、User.Identity.IsAuthenticated )。

私のクライアント側では、トークンを取得してから、Azure API Managementを介して公開されているAPIを呼び出しています。サーバー上で

HttpClientHandler handler = new HttpClientHandler 
{ 
    UseDefaultCredentials = true 
}; 

client = new HttpClient(handler); 
authContext = new AuthenticationContext(AADInstance); 

PlatformParameters platformParameters = new PlatformParameters(PromptBehavior.Auto); 
AuthenticationResult authResult = await authContext.AcquireTokenAsync(apiResourceId, clientId, redirectUrl, platformParameters); 

client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(authResult.AccessTokenType, authResult.AccessToken); 
client.DefaultRequestHeaders.Accept.Clear(); 
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
client.DefaultRequestHeaders.Connection.Add("Keep-Alive"); 
client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", subscriptionKey); 
client.DefaultRequestHeaders.Add("Host", "..."); 

client.BaseAddress = new Uri(baseAddress); 

var response = await GetResponseAsync(baseAddress + "Diagnostics"); 

、私は(私のAPIは、もちろん、それはAPI管理ポータルから呼び出されていることを知らない)APIを呼び出しUser.Identityを取得しようとしています。 User.Identity.Nameは空、AuthenticationTypeは空、IsAuthenticatedフラグはFalseです。これらの値は、API管理ポータル「試してください」機能を使用してAPIを呼び出すと正しく挿入されます。

HttpContext context = HttpContext.Current; 
userName = User.Identity.Name; //is empty 
ClaimsIdentity claimsIdentity = (ClaimsIdentity)User.Identity; 
items.Add($"Authentication Type: '{claimsIdentity.AuthenticationType}'"); // is empty 
items.Add($"Is Authenticated: {claimsIdentity.IsAuthenticated}"); // is False 

答えて

0

問題は、ベアラトークンの要求の一部として渡されたリソースIDです。 API管理ポータルではなく、のバックエンドAPIのアプリID URIである必要があります。

0

APIデフォルトでは、管理は認証ヘッダーには触れないので、クライアントがJWTトークンを送信している場合、バックエンドはそのまま受け取ります。

APIMでvalidate-jwtポリシーを使用して、クライアントが送信しているトークンが実際に有効であることを確認できます。

Try Itポータルの設定時に使用したのと同じクライアントIDをコンソールクライアントに使用していますか?そうでない場合は、AADのバックエンドに対してコンソールクライアントの権限が与えられていますか?

APIMからバックエンドにhttpsを送りますか? httpsを使用しないと、資格情報は無視されます。

+0

Try itポータルが使用している「clientID」がわかりません。 Ocp-Apim-Subscription-Key、Authorization Bearerトークン、およびサブスクリプションキーのみがリストされています。私はAADのConsoleアプリケーションの "clientID"を承認しました。私はHTTPsを使用しています(WebサービスURLとWeb API URLスキームは両方ともHTTPsに設定されています)。私はベアラトークンを送信していることをコードで知っているので、まだJWT検証の検証を設定しようとはしていません。 – JordanBean

関連する問題