在 Azure Active Directory 上启用 CORS

Posted

技术标签:

【中文标题】在 Azure Active Directory 上启用 CORS【英文标题】:Enabling CORS on Azure Active Directory 【发布时间】:2019-03-21 04:46:28 【问题描述】:

我正在尝试在 Angular 6 应用程序中使用以下方法以编程方式从 Azure Active Directory 获取访问令牌。

    let body1 = new FormData()
    body1.append("resource", environment.config.clientId)
    body1.append("grant_type", "client_credentials")
    body1.append("client_id", environment.config.clientId)
    body1.append("client_secret", "*****")

    return this._http.post("https://login.microsoftonline.com/" + environment.config.tenant + "/oauth2/token", body1)

我能够在 Postman 中通过此 url 检索访问令牌,但在通过我的应用程序调用它时被 CORS 阻止。错误如下。

    Failed to load https://login.microsoftonline.com/*****/oauth2/token: 
Response to preflight request doesn't pass access control check: No 'Access-
Control-Allow-Origin' header is present on the requested resource. Origin 
'http://localhost:4200' is therefore not allowed access.

那么,如何在 Azure Active Directory 上为所有域启用 CORS?

【问题讨论】:

【参考方案1】:

简单,你不会。

您正在做的是向公众公开您应用的客户端机密。 请记住,请求将来自用户的设备。 所以他们可以观察它并捕捉你的秘密。 这就是令牌端点不支持 CORS 的原因,而且可能永远不会支持。

更新:如果您使用 SPA 平台配置回复 URL,则令牌端点现在支持 CORS。这允许将授权代码流与 PKCE 一起使用。 MSAL.js 2.0 支持此流程。请注意,这仍然不涉及客户端机密。

从前端 JS 应用程序获取令牌的方法是使用隐式授权流或授权码流和 PKCE。 或者,如果您确实需要一个仅限应用程序的令牌,那么您必须从后端应用程序执行您尝试过的请求。

隐式授权流程允许您在用户登录时直接从授权端点获取令牌。 您可以使用 ADAL.JS/MSAL.JS 来协助执行此操作。 您无法拥有没有用户身份的令牌,因为您的原生应用无法证明其身份。

【讨论】:

+1 到这个答案。 CORS 阻止了你,因为你试图在浏览器中做一些你应该永远在浏览器中做的事情。 感谢@juunas 提供的信息。我在我的应用程序中使用 adal 进行用户登录,但是在应用程序的一部分中,我希望用户能够在无需登录的情况下查看某些特定的私有内容(我无法制作我正在尝试的数据检索公共)。这个应用程序不会被部署,本质上是一个概念证明,所以我正在寻找解决这个问题的方法。你知道一种以编程方式登录的方法,这样用户就不必这样做了吗?是否使用adal? 您的应用需要一个后端来获取数据并将其返回给前端。 Hmmmm... 如果我们想在浏览器上使用 PKCE 流应该怎么做?是否已从推荐的最佳实践中删除了隐式流程? 我认为 Azure AD 中尚不支持此方案的 PKCE。因此,隐含的方式是当时要走的路。

以上是关于在 Azure Active Directory 上启用 CORS的主要内容,如果未能解决你的问题,请参考以下文章

用于查询Azure Active Directory的Azure服务

Azure-Azure Active Directory(AAD)

text Azure Active Directory身份验证

在 Azure Active Directory 上启用 CORS

访问Azure Active Directory用户和角色

在本地和 Azure 上使用 Active Directory 进行身份验证