【问题标题】:User.Identity.Name is empty when API is called through Azure API Management通过 Azure API 管理调用 API 时 User.Identity.Name 为空
【发布时间】:2017-11-06 22:34:06
【问题描述】:

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

如果我通过 API 管理门户网页(Try It 测试门户)调用我的 API,我的服务器端 API 代码能够看到我的 User.Identity (User.Identity.Name, User.Identity.IsAuthenticated)。

在我的客户端,我得到一个令牌,然后调用一个通过 Azure API 管理公开的 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,这些值会正确填充。

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    你是从 APIM 到后端做 https 吗?如果没有 https,凭据可能会被忽略。

    【讨论】:

    • 我不确定 Try It 门户使用的是什么“clientID”。它仅列出 Ocp-Apim-Subscription-Key、授权承载令牌和订阅密钥。我已在 AAD 中授权控制台应用程序的“clientID”。我正在使用 HTTPs(Web 服务 URL 和 Web API URL 方案都设置为 HTTPs)。我还没有尝试设置验证 JWT 策略,因为我通过我的代码知道我正在发送一个不记名令牌。
    【解决方案2】:

    问题在于作为承载令牌请求的一部分传入的资源 ID。它必须是后端 API 的应用 ID URI,而不是 API 管理门户。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-11
      • 2016-04-27
      • 1970-01-01
      • 2019-01-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多