ADFS v4.0 和 /userinfo 端点给出 405

ADFS v4.0 and /userinfo endpoint giving 405

将较旧的 ASP.NET 服务器端应用程序集成到 ADFS 中以进行身份​​验证,这意味着我几乎不得不从头开始编写所有内容。在 /userinfo 调用之前一切正常(/authorize、/token)。

我的代码,简而言之-

HttpClient client = new HttpClient();

var req = new HttpRequestMessage {
    RequestUri = new Url("https://<server_ip>/adfs/oauth2/userinfo"),
    Method = HttpMethod.Get,
};
req.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token.AccessToken);
req.Headers.UserAgent.Clear();
req.Headers.UserAgent.Add(new ProductInfoHeaderValue("OldApp", "11.3.0"));
var result = await client.SendAsync(req);

结果是 HTTP 错误 405 - 方法不允许。在线搜索时,我认为这是一个常见问题,当尾随“/”离开 url 时,但 我得到与尾随斜杠相同的结果

在四处寻找之后,有很多使用较新库的示例,但遗憾的是我无法使用。 None 提及 /userinfo 的用法,我认为问题不一定在于我如何调用 URL,而是在 ADFS 中配置 'Application Group'。

我个人被引导去做和你一样的事情,唯一的解决办法是下载 ADAL(你会发现下面的 link) 并调试代码以便从 ADAL[ 重新生成相同的 HTTP 流=25=].

您可以创建一个新项目,以便您可以集成 ADAL,用于调试或拦截 HTTP

Link ADAL

好的 - 我发现了这个问题,并将在此处记录下来以防其他人遇到同样的事情..

虽然我不确定为什么 /userinfo 给出 405 - 我使用的 URL 是错误的,尽管它被列在 Endpoints 文件夹中。 URL 中不应有任何 "oauth2"。正确的代码(和 URL)是:

var req = new HttpRequestMessage {
    RequestUri = new Url("https://<server_ip>/adfs/userinfo"),
    Method = HttpMethod.Get,
};
req.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token.AccessToken);
req.Headers.UserAgent.Clear();
req.Headers.UserAgent.Add(new ProductInfoHeaderValue("OldApp", "11.3.0"));
var result = await client.SendAsync(req);

还有一点要记住——这在别处已经说明了,但不像这里那么清楚,我希望: /userinfo 只会为您提供 NameIdentifier ("sub") 声明。 (据我所知。)无论您通过什么范围。您将从 /token 调用的 "id_token" 参数中获取所有信息(通常应该在 /userinfo 调用中),编码为 JWT。