通过Azure API Management调用API时,User.Identity.Name为空

时间:2017-11-06 22:34:06

标签: c# azure-active-directory azure-api-management

如果我通过API管理从客户端调用我的API(示例是本机控制台应用),则我的User.Identity.Name为空,后端API中的IsAuthenticated为False。 < / p>

如果我通过API管理门户网站(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的User.Identity(我的API,当然,并不知道它是通过API管理门户调用的)。 User.Identity.Name为空,AuthenticationType为空,IsAuthenticated标志为False。如果我通过API管理门户调用我的API,那么这些值就会正确填充&#34;试一试&#34;功能

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

2 个答案:

答案 0 :(得分:0)

API管理默认情况下不会触及Authorization标头,因此如果客户端正在发送JWT令牌,那么后端应该不受影响地接收它。

您可以尝试在APIM中使用validate-jwt策略来验证客户端发送给您的令牌实际上是否有效。

您是否使用与用于设置Try It门户的控制台客户端相同的clientId?如果没有,控制台clientId是否已获得AAD后端的授权?

您是否正在从APIM向后端执行https?如果没有https,则可以忽略凭据。

答案 1 :(得分:0)

问题是作为Bearer令牌请求的一部分传入的资源ID。它必须是后端API的 App ID URI ,而不是API Management门户。