使用 Azure Active Directory 身份验证在 Linux 上重新启动 Azure 应用服务会重置 /.auth/me/
Posted
技术标签:
【中文标题】使用 Azure Active Directory 身份验证在 Linux 上重新启动 Azure 应用服务会重置 /.auth/me/【英文标题】:Restarting Azure App Service on Linux with Azure Active Directory authentication resets /.auth/me/ 【发布时间】:2020-01-05 14:30:55 【问题描述】:我正在使用 Azure 应用服务身份验证/授权来限制对我的 Web 应用程序的访问,并使用 Azure Active Directory 作为登录方法。
我已将“请求未通过身份验证时采取的操作”设置为“使用 Azure Active Directory 登录”。
为了查找有关登录用户的详细信息,我向 /.auth/me 端点 (as instructions from Microsoft docs says) 发出请求。这工作正常,直到应用程序在 Azure 中重新启动。重启后,/.auth/me/ 端点返回一个空数组,而不是用户信息。
如果应用服务计划运行 Linux,我只能重现该问题。如果我创建 Windows 应用服务计划,即使在重新启动后也会填充 /.auth/me 端点。
我尝试在 Azure 上创建一个新应用,但没有上传任何代码,但问题仍然存在。
我是否需要设置一些额外的设置才能在基于 Linux 的 ASP 上工作?我已经使用基于 docker 的 ASP 和基于代码(基于 dotnet core 2.2)进行了测试。
【问题讨论】:
【参考方案1】:我做了一些研究并验证了你提到的情况。在 Linux 中,重新启动后信息会丢失,但是在 Windows 中它运行良好。原因是处理 Linux 身份验证的中间件容器被重新生成,因此用户数据将在重新启动后被擦除。我们可以监控到,实际上重启后,登录状态保持不变,丢失的只是与docker容器相关的信息。
如果需要通过/.auth/me复用当前用户的信息,需要在首次登录后通过代码记录authMe信息。
【讨论】:
谁的缓存?在不清除缓存的情况下注销/登录也可以,但不幸的是,让用户注销或清除他们的缓存并不是解决方案。 @Kristian 好的,我会为你做进一步的研究。 @Kristian 更新答案,希望对您有所帮助。 谢谢@Tony。我也得到了微软的答复,提供了更多关于他们建议我做什么的信息。他们的方法避免了必须自己记录 /.auth/me 响应。我将此作为单独的答案发布【参考方案2】:我得到了Microsoft on their forums 的答复。正如@Tony 还发现的那样,这是因为处理 Linux 应用服务身份验证的中间件容器重新启动并丢失了它的令牌。当您使用 Linux 应用服务时,中间件容器是在 Azure 中的代码旁边/前面运行的第二个容器,它处理所有 Auth 魔法(请参阅 this blog post by Jan Hajek on the middleware container)
Microsoft 目前正在调查令牌丢失是一个潜在的错误,他们推荐的解决方法是使用 "Blob storage token store",这意味着 Azure 中间件容器会将令牌存储在 blob 存储中而不是磁盘上,从而使它们保持重启.
实施:
-
在 azure 中创建一个 blob 存储(如果您还没有想要使用的)
创建一个只有私有访问权限的 blob 容器
在存储实例上创建共享访问签名。
授予它访问*: 允许的服务:Blob 允许的资源类型:容器、对象 允许的权限:读取、写入、列出、创建 为您的 SAS 设置开始/结束日期 生成 SAS 并复制“Blob 服务 SAS URL”修改 SAS URL 以包含您的 Blob 容器名称。例如,如果您在第 2 步中创建的容器名为 "tokens",请将您的 SAS URL 修改为:
https://xxxxx.blob.core.windows.net/?sv=2018-03-28...
到
https://xxxxx.blob.core.windows.net/tokens/?sv=2018-03-28...
WEBSITE_AUTH_TOKEN_CONTAINER_SASURL
并为其提供修改后的 SAS URL 的值
转到您的网站并登录。现在应该在 blob 存储中创建一个令牌,并且在重新启动后也将使用该令牌。
如果不能立即运行,请尝试在 Azure 中停止/启动 Web 应用程序。有关其他调试提示,请参阅上述博客文章。
(*) 上面链接的博客文章指出 SAS 所需的权限较少,但我发现我还必须添加对象访问权限。
【讨论】:
以上是关于使用 Azure Active Directory 身份验证在 Linux 上重新启动 Azure 应用服务会重置 /.auth/me/的主要内容,如果未能解决你的问题,请参考以下文章
使用Laravel的Azure Active Directory SSO
使用Xamarin.iOS进行Azure Active Directory身份验证过程
用于查询Azure Active Directory的Azure服务
使用 DataGrip - Active Directory 连接到 Azure 数据库