【问题标题】:Azure AD different number of client and server claimsAzure AD 不同数量的客户端和服务器声明
【发布时间】:2017-06-24 12:47:30
【问题描述】:

我们需要将 AzureAD 身份验证流程集成到我们现有的项目中。所以我在here 找到了示例代码。它基本上包含两个 Web 项目。一个 MVC 项目作为客户端和 Web API 作为服务器。

我们虽然使用来自 JWT 令牌的“upn”声明来唯一标识登录用户。我运行了示例代码并能够在 Azure AD 中对用户进行身份验证。当我在 jwt.io 检查从 AAD 获得的访问令牌时,声明部分不包含“upn”,但我能够使用ClaimsPrincipal.Current.FindFirst(ClaimTypes.Upn) 在客户端上检索“upn”。将此访问令牌添加为不记名授权标头并调用 Web api。在这里,我无法使用ClaimsPrincipal.Current.FindFirst(ClaimTypes.Upn) 检索“upn”声明。此声明的值为 null。我是否需要做任何额外的配置才能进入服务器端。到目前为止,我只能在客户端检索 upn。

【问题讨论】:

  • 您需要展示您如何在 API 端配置身份验证。您获取的访问令牌是否适用于 API? (即其受众声明是否设置为 API 的应用程序 ID URI)
  • @juunas 是的,Audience 值是 API 的 AppID URI。正如我所说,它是从 Git 下载的示例项目。我刚刚更改了 Audience 和 TenantID 键的 web.config 值。

标签: asp.net-web-api jwt claims-based-identity azure-active-directory


【解决方案1】:

有问题的示例项目:

以应用程序的身份而不是用户的身份调用 Web API

在 TodoListController 的第 95 行,它通过以下方式获取令牌:

result = await authContext.AcquireTokenAsync(todoListResourceId, clientCredential);

它将 API 作为自身调用,因此它是仅限应用调用,而不是委托调用。因此没有UPN。您会发现一个 appid 声明,尽管它标识了调用应用程序。

查看另一个对 API 进行委托调用的示例:https://github.com/Azure-Samples/active-directory-dotnet-webapp-webapi-openidconnect/blob/master/TodoListWebApp/Controllers/TodoListController.cs

如您所见,获取令牌的调用完全不同:

string userObjectID = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value;
AuthenticationContext authContext = new AuthenticationContext(Startup.Authority, new NaiveSessionCache(userObjectID));
ClientCredential credential = new ClientCredential(clientId, appKey);
result = await authContext.AcquireTokenSilentAsync(todoListResourceId, credential, new UserIdentifier(userObjectID, UserIdentifierType.UniqueId));

注意认证配置也不同:https://github.com/Azure-Samples/active-directory-dotnet-webapp-webapi-openidconnect/blob/master/TodoListWebApp/App_Start/Startup.Auth.cs

【讨论】:

  • 谢谢。会通知您它是否有效。
  • 现在可以在令牌中获取 UPN。谢谢
  • 太棒了!请记住,现在客户端静默获取令牌,而不是调用令牌端点。如果在缓存中找不到令牌,这将失败。它使用的NaiveSessionCache 类只是将令牌存储在会话中。默认情况下,会话在内存中。因此,如果您的服务器因任何原因重新启动,则需要将用户再次重定向到 Azure AD 以在缓存中获取新令牌。如果您想要一个更强大的解决方案,则必须将缓存类替换为例如数据库存储。
猜你喜欢
  • 2021-04-21
  • 1970-01-01
  • 2015-02-28
  • 2022-12-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-25
  • 1970-01-01
  • 2022-12-18
相关资源
最近更新 更多