如何根据 ADFS 3.0 识别通过 ADAL 身份验证的用户?

How to identify a user authenticated with ADAL against ADFS 3.0?

我有 ADAL iOS 使用 ADFS 3.0 服务器。它打开一个 Web 视图,用户进行身份验证,然后我收到一个带有访问令牌的回电。

我遇到的问题是我没有收到有关用户身份的任何信息。 userInformation 属性 是 nil。任何 HTTP 响应中都没有 id_token,我不确定如何首先请求一个。我在其他地方看到微软人员说 ADFS 3.0 根本不支持 id_token。我还解析了 JWT 格式的访问令牌,但其中也没有可用于识别用户的信息。

在 ADFS 3.0 服务器端,我们配置并启用了一个声明规则,该规则表示向依赖方提供 GUID、名字、姓氏和电子邮件地址。但添加该规则对我通过 ADAL 获得的响应没有影响。

我如何识别通过 ADAL 对 ADFS 3.0 服务器进行身份验证的用户(即获取 GUID、名字、姓氏和电子邮件地址)? ADFS 3.0 服务器上是否有我可以使用提供的访问令牌访问的端点,我可以在其中请求此信息?

事实证明 ADFS 3.0 可能不支持 id_token,但如果您正确设置了依赖方的声明规则,它们将被添加到您收到的访问令牌的顶层。显然声明规则在正确时应该看起来像这样:

访问令牌是 JWT 令牌,因此可以对其进行解码并从中检索值。解码后,它看起来像这样:

{
    "appid": "5f9a5589-6064-423a-8a1a-6a0d7ddda19f",
    "aud": "x-msauth-glazersapp://com.example.MyApp",
    "auth_time": "2016-08-08T22:32:14.459Z",
    "authmethod": "urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport",
    "email": "me@example.com",
    "exp": 1470699134,
    "family_name": "John",
    "given_name": "Doe",
    "iat": 1470695534,
    "iss": "http://adfs.example.com/adfs/services/trust",
    "objectGUID": "c8oMVOOEskutnPVno41Y1w==",
    "ver": "1.0",
}

"email"、"family_name"、"given_name" 和 "objectGUID" 已添加到访问令牌。请注意,这样提供的 GUID 实际上是 Base64 编码的。

此处提供更多信息:http://chrisrisner.com/Accessing-Resources-Secured-By-Azure-Active-Directory-with-iOS-and-Android