c# - 认证2.0 |水疗 | id_token如何伪装成access_token来访问受限制的网络资源?

标签 c# azure oauth-2.0 azure-active-directory single-page-application

我正在致力于将 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):

  1. 使用 id_token 的 client_id、资源...访问 Azure Auth 端点
  2. 用凭据挑战它
  3. 获取 id_token,因为它被发布回 SPA URI。
  4. 使用 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 的特例。

问题:

  1. AAD 如何确定“id_token”持有者可以访问哪些网络资源?通过查找与 SPA AAD 注册相关的网络资源?

    [OP] Adal.js 负责拦截我们的回发以接收和存储 id_token 和 access_token 等 token

  2. 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.comscope=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/

相关文章:

c# - 应用洞察监控

c# - 如何使用 JSON.NET 将 JSON 数组中的对象名称用作属性值?

Azure 事件日志 - 从博客下载文件

oauth-2.0 - Spring Boot Oauth2 - 访问 token 存储在哪里?

c# - C#中小数点是否为零

Azure AD 应用程序 API 权限 - 在哪里获取所授予权限的 ID

Azure模板参数 "password"加密

c# - 如何将 json 格式的有效负载附加到 RestSharp 请求中?

javascript - 使用 Linkedin 代码登录给我 html 验证错误

c# - 从 ASP.NET CORE 中的字节加载程序集