未在来自 ADFS 3.0 的 OAuth2 访问令牌中使用的 JWT 中获取用户身份

Not getting user identity in JWT used in OAuth2 access token from ADFS 3.0

我按以下方式使用 ADFS 3.0 支持的授权流程,

  1. 浏览器连接到 MyService
  2. MyService 将浏览器重定向到 ADFS 以进行 OAuth
  3. 浏览器连接到 ADFS 以获得 OAuth 授权码
  4. ADFS 通过浏览器对用户进行身份验证
  5. ADFS 将浏览器重定向回 MyService 以及授权码
  6. 浏览器连接到 MyService 并传递授权令牌
  7. MyService 连接到 ADFS 并从授权令牌中获取访问令牌

但是,访问令牌缺少用户身份,MyService 无法识别用户。

访问令牌具有以下 JWT 信息。

{ "aud": "urn:relying:party:trust:identifier",
"iss": "http://ms.cloud.com/adfs/services/trust",
"iat": 1452875046,
"exp": 1452878646,
"auth_time": "2016-01-15T15:35:20.248Z",
"authmethod": "urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport",
"ver": "1.0",
"appid": "my-app" }

有人可以告诉我 MyService 在从 ADFS 获得访问令牌后如何识别用户吗?

依赖方信任中的声明规则需要定义要作为 JWT 令牌的一部分发送的声明。一旦我们添加了电子邮件、姓名等的声明规则,信息就会添加到 JWT 访问令牌中。

  1. 编辑 ADFS 中 Active Directory 的声明提供者信任以传递电子邮件、姓名等

    • 打开 ADFS。单击 "Claims Provider Trusts"。点击 "Active Directory"。
    • 然后,点击右边的"Edit Claim Rules"。 您现在应该会看到“编辑声明”对话框。 有关有关添加声明的说明,请参阅此视频。跳至时间索引 2:40。 Edit Claims Provider Rules
  2. 编辑依赖方信任的声明。对于电子邮件、姓名等,使用 LDAP 作为规则类型并使用 select Active Directory 作为属性存储源添加匹配的颁发转换规则。通过对与您的 JWT 客户端关联的依赖方信任重复上述步骤来执行此操作。 要添加依赖方声明,请参阅此视频并跳至时间索引 14:35 Edit Relying Party Claim Rules

我建议将 SAM-Account-Name 作为 http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name 传递。我依稀记得 WIF 在 ClaimsPrincipal 上有问题,如果你不这样做的话。

此外,如果您尚未在 Active Directory 上启用声明支持,则必须这样做。