我已经从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。我真的很感谢您的帮助!
答案 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)
您需要确保您还请求openid
和profile
范围。
可以在文档here中找到有关范围的信息以及各个权利要求中的哪些信息,以及一些基本概述信息here
我下载了您引用的样本。在App.config文件中,我将范围键更改为/ access_as_user openid配置文件电子邮件“ />并运行了代码。这导致获得preferred_username声明-”代表v2.0端点中用户的主要用户名。它可以是电子邮件地址,电话号码或不带指定格式的通用用户名。它的值是可变的,并且可能随时间变化。概要范围是必需的,以便接收此声明。”
openid
,profile
和email
范围是在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
的形式请求它们,则这些范围都不应使用任何应用程序标识符。