我已经建立了一个项目,例如来自 Microsoft 的以下示例,其中我有一个 native 应用程序请求使用 v2.0 端点访问 Web API:https://github.com/azureadquickstarts/appmodelv2-nativeclient-dotnet
我已使用在 AAD 中注册的帐户而非 Microsoft 帐户成功登录到 AAD。我确实收到了 claim ,但是 claim 既不包含 upn 也不包含电子邮件。我正在使用 jwt.ms 来分析 claim ,这是我从 claim 中收到的信息:
{
"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]
我不明白为什么我在 claim 中没有收到 UPN。如果有任何帮助,我将不胜感激!
最佳答案
您需要确保您还请求了 openid
和 profile
范围。
关于哪些范围在各个权利要求中提供哪些信息的信息可以在文档中找到 here一些基本的概述信息 here
我下载了您引用的示例。在 App.config 文件中,我将范围键更改为/access_as_user openid profile email"/> 并运行代码。这导致获得 preferred_username 声明 - "表示 v2.0 端点中用户的主要用户名。它可以是电子邮件地址、电话号码或没有指定格式的通用用户名。它的值是可变的,可能会随着时间而改变。需要配置文件范围才能接收此声明。”
openid
、profile
和 email
范围是 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) 的工作或学校帐户的用户可以登录应用程序。
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,其中显示在scopes_supported
部分:
"scopes_supported":
[
"openid",
"profile",
"email",
"offline_access"
],
这四个范围是 v2 端点的特殊范围,因此当您请求它们时,您不需要查看这些范围正在访问的应用程序或服务主体。它们在某种程度上对 v2 端点是全局的,因此当您请求它们时,您请求它们作为 openid profile email offline_access
不应将应用程序标识符用于这些范围。
关于jwt - 使用 v2.0 终结点的声明中缺少 UPN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51928314/