Azure AD 重定向 URI 从 https 更改为 http
Azure AD redirect URI changes from https to http
概览
我在 Azure AD 门户上注册了一个应用程序。重定向机制在开发中一直运行良好,但 Oauth 重定向 URI 发生了奇怪的转换。
客户端应用程序是使用 Django 框架构建的,并使用 MSAL 作为 Python 库。
具体问题
假设我在 Azure AD 应用程序注册中指定了如下重定向 URI:https://myapp.com/auth/redirect
我得到一个错误AADSTS50011: The reply URL specified in the request does not match the reply URLs configured for the application: '<application ID>'
深入研究发送的请求,我可以看到,重定向 URI 在该过程的某处以某种方式被操纵。
(注意从 https -> http 的转换)
...redirect_uri=http%3A%2F%2Fmyapp.com%2Fauth%2Fredirect&scope=User.Read.basic....
但 Azure AD 实际上甚至不接受 URL 的纯 http。
我试图用本地主机产生同样的错误,(因为本地主机 URL 是规则的例外,只允许 https URL)和重定向 URL http://localhost:8000/auth/redirect
身份验证过程有效,并且 https://localhost:8000/auth/redirect
产生与上述相同的结果。
此错误通常是由 2 个不同的配置问题引起的。
(1) 从与您为应用配置的地址不同的地址访问页面。
(2) 你自己配置有误。在这两种情况下,解决问题通常都相当容易。
您问题中的配置似乎出现了错误。
如果为访问令牌请求 /token
端点,请注意 redirect_uri
参数,redirect_uri 需要与重定向 URI 之一相同(导航到您的应用 -> 身份验证) 在门户中。如果使用C#,还需要在配置中设置。
实际出来的问题是...
该错误更多地与 Django 内部结构以及 MSAL 库相关。
Azure AD MSAL library for Python 在内部使用 reverse(redirect_uri)
方法在内部某处构建重定向 uri,并且由于 Django 请求在内部使用 HTTP,因此添加到请求的重定向 uri 是 HTTP 一个.
解决方案
将 SECURE_SSL_REDIRECT = True
添加到 settings.py
解决了问题。
虽然普通的./manage.py runserver
命令不支持HTTPS,所以
pip install werkzeug django-extensions pyOpenSSL
- 在setting.py下添加
django_extensions
INSTALLED_APPS
- 运行 服务器
./manage.py runserver_plus --cert /tmp/cert localhost:8000
当程序在带有前端代理的网络服务器中运行时,还要添加这一行,以不更改后端返回的原始请求:
在 settings.py -> SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
概览
我在 Azure AD 门户上注册了一个应用程序。重定向机制在开发中一直运行良好,但 Oauth 重定向 URI 发生了奇怪的转换。
客户端应用程序是使用 Django 框架构建的,并使用 MSAL 作为 Python 库。
具体问题
假设我在 Azure AD 应用程序注册中指定了如下重定向 URI:https://myapp.com/auth/redirect
我得到一个错误AADSTS50011: The reply URL specified in the request does not match the reply URLs configured for the application: '<application ID>'
深入研究发送的请求,我可以看到,重定向 URI 在该过程的某处以某种方式被操纵。
(注意从 https -> http 的转换)
...redirect_uri=http%3A%2F%2Fmyapp.com%2Fauth%2Fredirect&scope=User.Read.basic....
但 Azure AD 实际上甚至不接受 URL 的纯 http。
我试图用本地主机产生同样的错误,(因为本地主机 URL 是规则的例外,只允许 https URL)和重定向 URL http://localhost:8000/auth/redirect
身份验证过程有效,并且 https://localhost:8000/auth/redirect
产生与上述相同的结果。
此错误通常是由 2 个不同的配置问题引起的。
(1) 从与您为应用配置的地址不同的地址访问页面。
(2) 你自己配置有误。在这两种情况下,解决问题通常都相当容易。
您问题中的配置似乎出现了错误。
如果为访问令牌请求 /token
端点,请注意 redirect_uri
参数,redirect_uri 需要与重定向 URI 之一相同(导航到您的应用 -> 身份验证) 在门户中。如果使用C#,还需要在配置中设置。
实际出来的问题是...
该错误更多地与 Django 内部结构以及 MSAL 库相关。
Azure AD MSAL library for Python 在内部使用 reverse(redirect_uri)
方法在内部某处构建重定向 uri,并且由于 Django 请求在内部使用 HTTP,因此添加到请求的重定向 uri 是 HTTP 一个.
解决方案
将 SECURE_SSL_REDIRECT = True
添加到 settings.py
解决了问题。
虽然普通的./manage.py runserver
命令不支持HTTPS,所以
pip install werkzeug django-extensions pyOpenSSL
- 在setting.py下添加
django_extensions
INSTALLED_APPS
- 运行 服务器
./manage.py runserver_plus --cert /tmp/cert localhost:8000
当程序在带有前端代理的网络服务器中运行时,还要添加这一行,以不更改后端返回的原始请求:
在 settings.py -> SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')