Microsoft AD 应用程序验证失败:“microsoft-identity-association.json 的内容长度未设置或无效”

Sér*_*hin 2 google-app-engine http flask azure-active-directory

我正在努力使用 Azure Active Directory 验证我们的应用程序,以使用他们的 SSO。

为了验证我们的域名,他们要求在以下地址提供一个 JSON 文件:{publisher_domain}/.well-known/microsoft-identity-association.json

在我们的 Flask 应用程序中,我使用以下路线提供文件:

@app.route('/.well-known/microsoft-identity-association.json')
def microsoft_identity_association():
    file = '.well-known/microsoft-identity-association.json'

    return send_file(file, mimetype='application/json')
Run Code Online (Sandbox Code Playgroud)

我还尝试将 JSON 加载到字典中并返回字典,让 Flask 渲染响应:

@app.route('/.well-known/microsoft-identity-association.json')
def microsoft_identity_association():
    file = '.well-known/microsoft-identity-association.json'
    with open(file, encoding="utf-8") as file:
        result = ujson.load(file)
        response = flask.Response(result, mimetype='application/json')
        response.headers.add('content-length' , str(result.__len__()))

    return send_file(file, mimetype='application/json')
Run Code Online (Sandbox Code Playgroud)

但每次,我都会得到相同的结果:

在对 GET 请求的响应中,content-length标头存在于我的本地环境中,但在我的应用程序部署在 Google App Engine Flex 上时消失。我检查了他们的文档(https://cloud.google.com/appengine/docs/flexible/python/reference/request-headers)并联系了他们,但没有真正成功。
他们说“看起来这正在按预期工作。HTTP/2 不需要“内容长度”,因此它被剥离了。”

看起来这个 Microsoft 应用程序验证程序是新的(2019 年 5 月),因此很难找到类似的问题。

这里有人遇到过同样的情况并希望找到解决方案吗?

Sér*_*hin 7

经过更多的研究并在不同的技术支持之间花费了一些时间,我终于找到了一个解决方案来验证我们的应用程序。我将在这里解释它,以防它对某人有用。

问题原因

Microsoft Azure AD 提出的验证过程是向我们服务器上的端点发出 GET 请求,并期望带有正确的“content-lenght”标头的“aplication/json”响应。

但是我们的服务器使用的是 HTTP 1.1 协议并且

对于 HTTP 协议 1.1 版本,分块传输机制被认为始终是可接受的,即使未在 TE 请求标头字段中列出,并且当与其他传输机制一起使用时,应始终最后应用于传输的数据,并且永远不会更多超过一次。(来源:维基百科

发送方不得在任何包含 Transfer-Encoding 头字段的消息中发送 Content-Length 头字段。
(来源:RFC

看来验证过程不符合HTTP 1.1协议。

解决方案

解决方案最终非常简单:使用替代的域验证程序

在 Azure AD 上,我能够使用 DN 上的 TXT 记录来验证我们的域,如Microsoft 文档中所述

我希望这能帮助其他陷入应用程序域验证困境的人。