1

我有一个 SPA,用户在 ADFS 中进行身份验证,应用程序获取访问令牌。我正在尝试使用 JS 代码来模拟 ADAL JS 的功能,其中隐藏的 iframe 用于向 ADFS 发出请求以获取新令牌。

这是 iframe 的“src”值:

https://../adfs/oauth2/authorize?client_id=...&response_type=id_token&redirect_uri=...&prompt=none&domain_hint=...&login_hint=...&nonce= ...

ADFS 配置有两个领域:AD 和 ADLDS (LDAP)。因此,我不确定我需要为 ADLDS 中的用户传递 domain_hint 和 login_hint 参数的哪些值。

请求失败并显示消息:

https://....html?client-request-id=...#error=login_required&error_description=MSIS9621%3a+Unable+to+handle+the+OAuth+authorization+request+without+getting+user+input

ADFS 事件查看器显示此错误:

异常详细信息:Microsoft.IdentityServer.Web.Protocols.OAuth.Exceptions.OAuthNoPassiveException:MSIS9233:为 OAuth 授权请求找到多个身份提供程序,提示设置为无。无法完成家庭领域发现。

ADFS 2016 是否实际支持此功能?知道我在做什么错吗?

4

1 回答 1

1

prompt=nonerequest 参数表示您希望在没有用户交互的情况下向进程传递请求/authorize。但是在处理过程中,有些事情需要用户交互——服务器可能不知道选择哪个身份提供者,所以它返回错误。如果您只是通过将/authorizeURL 粘贴到浏览器而不带prompt=none参数来发出相同的请求,则服务器可能会为您提供选择提供商的可能性。

您写道您想获得一个访问令牌,但您的/authorizeURL 包含response_type=id_token. 如果你想要一个访问令牌,参数应该是response_type=token(见RFC)。

查看Azure 文档domain_hintOpenID Connect 支持请求参数,因此您的请求scope参数应包含 openid值。获取 ID 令牌也是必要的(如果需要)。

于 2019-01-23T09:39:08.530 回答