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

时间:2018-08-20 10:01:17

标签: jwt azure-active-directory claims

我已经从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。我真的很感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您需要明确地请求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

答案 1 :(得分:0)

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

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

这四个范围是v2端点的特殊范围,因此,当您请求它们时,无需查看这些范围正在访问的应用程序或服务主体。它们对于v2终结点而言是全局的,因此,当您请求它们时,您以openid profile email offline_access的形式请求它们,则这些范围都不应使用任何应用程序标识符。