使用 v2.0 端点的声明中缺少 UPN

Posted

技术标签:

【中文标题】使用 v2.0 端点的声明中缺少 UPN【英文标题】:Missing UPN in claim using v2.0 endpoint 【发布时间】:2019-01-26 10:33:29 【问题描述】:

我已经从 Microsoft 建立了一个类似于以下示例的项目,其中我有一个本机应用程序请求使用 v2.0 端点访问 Web api:https://github.com/azureadquickstarts/appmodelv2-nativeclient-dotnet

我已成功使用在该 AAD 中注册的帐户而非 Microsoft 帐户登录到 AAD。我确实收到了索赔,但该索赔既不包含 upn 也不包含电子邮件。我正在使用 jwt.ms 来分析索赔,这是我从索赔中收到的信息:


   "typ": "JWT",
   "alg": "RS256",
   "kid": "1LTMzakihiRla_8z2BEJVXeWMqo"
.
   "aud": "Client ID/ App ID",
   "iss": "https://login.microsoftonline.com/tenantid/v2.0",
   "iat": 1534758037,
   "nbf": 1534758037,
   "exp": 1534761937,
   "aio": "ATQAy/8IAAAA+PZj+5vnrUwDfqTTKNBDcy0Tl7rOztkxzrb9YWXHVlevKwrlsGBP/gYAvL4bwr2G",
   "azp": "Client ID/ App ID",
   "azpacr": "0",
   "e_exp": 262800,
   "name": "xxx yyy",
   "oid": "9cc37e1d-0490-4cf4-9bb8-c872899dee91",
   "preferred_username": "test@tenantname.onmicrosoft.com",
   "scp": "access_as_user",
   "sub": "2l0nasrd8QbBpiEu1RGLFCavj3SzTzizIgmKAiMbdU0",
   "tid": "tenantid",
   "uti": "HG2cIi_MGUyBxBl6MzFPAA",
   "ver": "2.0"
.[Signature]

我不明白为什么我没有在索赔中获得 UPN。非常感谢任何帮助!

【问题讨论】:

在对用户进行身份验证时指定了哪些范围? 我使用的是默认范围:“access_as_user” 您可以尝试将openidprofile 添加到范围吗?不确定它是否会默认添加这些,但 v2 不会返回所有用户数据,除非您要求。 【参考方案1】:

您需要确保您还请求openidprofile 范围。 可以在文档here 中找到有关哪些范围给出了各个声明中的哪些信息的信息以及一些基本概述信息here 我下载了您引用的示例。在 App.config 文件中,我将范围键更改为 /access_as_user openid profile email" /> 并运行它的代码。这会导致得到 preferred_username 声明 - “代表 v2.0 端点中用户的主用户名。它可以是电子邮件地址、电话号码或没有指定格式的通用用户名。它的值是可变的,并且可能会随着时间而改变。需要配置文件范围才能接收此声明。” openidprofileemail 范围是 V2 端点中众所周知的范围的一部分,在 Azure AD developer's documentation 中进行了讨论。要查看那些众所周知的范围,您可以转到 URL:

https://login.microsoftonline.com/tenant/v2.0/.well-known/openid-configuration

tenant 可以替换为 common = 同时拥有个人 Microsoft 帐户和 Azure Active Directory (Azure AD) 工作或学校帐户的用户可以登录应用程序。 组织 = 只有拥有 Azure AD 工作或学校帐户的用户才能登录应用程序。 消费者 = 只有拥有个人 Microsoft 帐户的用户才能登录应用程序。 tenantGUID 或tenantName =(您的特定 Azure AD 租户 ID 或名称 - 即 contoso.onmicrosoft.com)单个租户的用户可以访问该应用程序。可以使用 Azure AD 租户的友好域名或租户的 GUID 标识符。

转到https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration URL,您将获得显示scopes_supported 部分下可用范围的JSON:

"scopes_supported": 
[
  "openid",
  "profile",
  "email",
  "offline_access"
],

这四个范围是 v2 端点的特殊范围,因此当您请求它们时,您不需要查看这些范围正在访问的应用程序或服务主体。它们在某种程度上对 v2 端点是全局的,因此当您请求它们时,您以 openid profile email offline_access 的形式请求它们,这些范围不应使用应用程序标识符。

【讨论】:

我已在应用注册门户中添加了 openid、个人资料和电子邮件范围,但我得到了相同的声明。我已经在 web api 下添加了范围,我还尝试在 Microsoft Graph Permissions 下添加范围。 如何调用授权端点?这是 SDK 吗? 这是用于获取令牌的代码: app = new PublicClientApplication(clientId, "login.microsoftonline.com/common/v2.0", TokenCacheHelper.GetUserCache());结果 = 等待 app.AcquireTokenSilentAsync(Scopes, app.Users.FirstOrDefault());其中 Scopes = "api://appid/access_as_user api://appid/openid api://appid/email" 我下载了您引用的示例。在App.config 文件中,我将范围键更改为<add key="TodoListServiceScope" value="api://<api_guid>/access_as_user openid profile email" /> 并运行代码。这将导致获得preferred_username 声明 - “代表 v2.0 端点中用户的主用户名。它可以是电子邮件地址、电话号码或没有指定格式的通用用户名。它的值是可变的,并且可能随着时间的推移而变化。需要配置文件范围才能接收此声明。" 我已经在只有 access_as_user 范围的声明中获得了 preferred_username。我不知道为什么它似乎忽略了其他范围。【参考方案2】:

您需要明确提出对 UPN 和电子邮件的请求。在 v1.0 端点中,它们默认返回,但因为 v2.0 需要更小的令牌,所以他们将其设为可选。通过以下链接,希望您的问题将得到解决。 为什么您必须请求 UPN 和电子邮件索赔 https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-optional-claims 如何在应用程序清单中添加可选声明 https://docs.microsoft.com/en-us/azure/active-directory/develop/reference-app-manifest

【讨论】:

以上是关于使用 v2.0 端点的声明中缺少 UPN的主要内容,如果未能解决你的问题,请参考以下文章

缺少 Spring Cloud Consul /refresh 端点

使用在端点上设置了标识的 WCF:正确的 UPN 不起作用

AAD 声明 UPN 与本地 AD UPN

IdentityServer 网站中缺少的声明,包括所有样本

Azure AD - 令牌中缺少角色声明

Django - PUT 端点验证器错误“wrapped_view() 缺少 1 个必需的位置参数:'request'”