Jwt 使用v2.0终结点的索赔中缺少UPN

Jwt 使用v2.0终结点的索赔中缺少UPN,jwt,azure-active-directory,claims,Jwt,Azure Active Directory,Claims,我从Microsoft设置了一个类似以下示例的项目,其中我有一个本机应用程序,请求使用v2.0端点访问web api: 我已使用在AAD中注册的帐户而不是Microsoft帐户成功登录到AAD。我确实收到索赔,但是索赔既不包含upn也不包含电子邮件。我正在使用jwt.ms分析索赔,这是我从索赔中收到的信息: { "typ": "JWT", "alg": "RS256", "kid": "1LTMzakihiRla_8z2BEJVXeWMqo" }.{ "aud": "Cl

我从Microsoft设置了一个类似以下示例的项目,其中我有一个本机应用程序,请求使用v2.0端点访问web api:

我已使用在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。我真的很感激任何帮助

您需要确保您也在请求
openid
profile
范围。 关于哪些范围提供了个人权利要求中的哪些信息的信息可以在包含一些基本概述信息的文档中找到
我下载了你引用的样本。在App.config文件中,我将作用域密钥更改为/access_as_user openid profile email“/>,并运行了代码。这导致获得首选_用户名声明—“代表v2.0端点中用户的主用户名。它可以是电子邮件地址、电话号码或没有指定格式的通用用户名。它的值是可变的,并且可能随时间而变化。需要配置文件范围才能接收此索赔。”
openid
profile
email
作用域是V2端点中已知作用域的一部分,在中进行了讨论。要查看这些已知作用域,可以转到URL:

https://login.microsoftonline.com/{tenant}/v2.0/.well-known/openid-configuration
其中,
{tenant}
可以替换为 common=同时拥有个人Microsoft帐户和Azure Active Directory(Azure AD)的工作或学校帐户的用户可以登录到应用程序。 organizations=只有拥有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您将获得JSON,该JSON在
scopes\u supported
部分下显示了可用的作用域:

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

这四个作用域是v2端点的特殊作用域,因此,当您请求它们时,您不需要查看这些作用域正在访问的应用程序或服务主体。它们在某种程度上是v2端点的全局作用域,因此当您请求它们时,您可以作为
openid profile email offline\u access
无应用程序标识来请求它们fier应用于这些作用域。

您需要明确请求UPN和电子邮件。在v1.0 endpoint中,默认情况下会返回它们,但由于v2.0需要较小的令牌,因此它们将其设置为可选。通过以下链接,希望您的问题会得到解决。 为什么您必须申请UPN和电子邮件索赔 如何在应用程序清单中添加可选声明

验证用户时,您指定了哪些作用域?我使用的是默认作用域:“以用户身份访问”“能否尝试将
openid
profile
添加到作用域中?不确定默认情况下是否会添加这些内容,但v2不会返回所有用户数据,除非您要求。我已在应用程序注册门户中添加了openid、配置文件和电子邮件范围,但我得到了相同的声明。我已在web api下添加了作用域,并尝试在Microsoft Graph权限下添加作用域。您如何调用授权端点?这是SDK吗?这是用于获取令牌的代码:app=new PublicClientApplication(clientId,“,tokencachelper.GetUserCache());结果=等待app.AcquireTokenSilentAsync(作用域,app.Users.FirstOrDefault());其中作用域=”api://appid/access_as_user api://appid/openid api://appid/email“我下载了您引用的示例。在
App.config
文件中,我将scope键更改为
,并运行代码。这将导致获得
首选\u用户名
声明-“代表v2.0端点中用户的主要用户名。它可以是电子邮件地址、电话号码或没有指定格式的通用用户名。其值是可变的,并且可能随时间而变。接收此声明需要配置文件范围。”我已经在声明中获得了首选的\u用户名,并且仅访问\u作为\u用户范围。我不知道为什么它似乎忽略了其余的范围。