我正在致力于将 Azure Active Directory
集成到我的 Angular SPA(或任何 Javascript)应用程序中。应用程序具有前端(使用 JavaScript 构建)和 Web API(使用任何 C# 或任何服务器端语言构建)。
仅供引用,https://github.com/Azure-Samples/active-directory-angularjs-singlepageapp
我知道我在 SPA AAD 注册中配置了 OAuth 2.0 隐式授予。 OAuth 2.0 隐式授权稍微宽松一些,允许 SPA 通过兑换“id_token”来访问与 SPA AAD 注册相关的 Web 资源。
OAuth 2.0 隐式授予协议(protocol):
- 使用 id_token 的 client_id、资源...访问 Azure Auth 端点
- 用凭据挑战它
- 获取 id_token,因为它被发布回 SPA URI。
- 使用 id_token 作为不记名 token 来访问受限制的网络资源。
SPA 与 id_token 和仅用于内部 Web API 的 OAuth 2.0 隐式授予协议(protocol)配合得很好。
无法从SPA或JS获取access_token的原因:
SPA 无法将 XHR 发送到 Azure token 端点,因为 SPA 被 Azure token 端点的 CORS 策略阻止。因此,SPA XHR无法获取access_token。
但是,Adal.js 的 iFrames 实现可以通过调用跨域 Web 资源来获取 access_token。
看起来这只是 SPA 的特例。
问题:
AAD 如何确定“id_token”持有者可以访问哪些网络资源?通过查找与 SPA AAD 注册相关的网络资源?
[OP] Adal.js 负责拦截我们的回发以接收和存储 id_token 和 access_token 等 token
AAD 不能实现以下方法吗?
- 使用 client_id、资源...重定向到 Azure 身份验证端点以获取身份验证代码。
- 通过将 Authorization_Code 发布回 SPA URI,从 Azure Auth 端点获取 Authorization_Code。
- 对于 XHR 到 Azure token 端点,我们不能使用 Auth_Code、client_id、资源等重定向到 Azure token 端点,让 Azure token 端点将 access_token 发回至 redirect_uri?
[OP] Adal.js 还有其他计划,即使用 iFrame 调用跨域 API(本例中为 Az Auth 端点)并获取访问 token 。
P.S.我需要上述问题的真实答案。此案现已解决:)!
最佳答案
How does AAD determine which web resources that 'id_token' holder can access? By looking up the web resources tied to SPA AAD Registration?
事实并非如此。 如果您的 API 配置为接受有效的 AAD token ,并且受众设置为前端应用程序的客户端 ID,它将接受该 token 。 但这不是一个好的模式,您应该使用访问 token 来调用 API。
至于您有关访问 token 的问题, 前端可以使用重定向或隐藏的 iframe 通过隐式流获取访问 token 。 如果您使用 ADAL.js 或 MSAL.js, 如果您向他们请求访问 token ,他们会自动为您执行此操作。
本质上,他们打开一个 iframe,该 iframe 会通过以下方式转到/authorize 端点:
response_type=token
resource=https%3A%2F%2Fgraph.microsoft.com
或scope=https%3A%2F%2Fgraph.microsoft.com%2FUser.Read
(如果使用) v2/MSAL提示=无
最后一个参数告诉 AAD 不要进行提示(它是一个隐藏的 iframe)。 如果用户浏览器中仍然存在有效 session ,并且已针对所请求的范围授予同意,则会返回一个 token ,作为 iframe 内您的 SPA 的重定向。 然后,ADAL/MSAL 可以从 iframe URL 获取 token ,因为它们在同一主机名上运行。
由于其工作方式,您需要在 SPA 加载时检查您是否位于 iframe 内,如果是,则根本不渲染应用程序。
不,您不能从 JS 前端调用/token 端点。
关于c# - 认证2.0 |水疗 | id_token如何伪装成access_token来访问受限制的网络资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55827056/