我在Azure有两个移动应用服务插槽:生产和开发。此外,我有一个可以使用此移动服务的客户端应用程序。生产槽中托管的应用程序版本不包含身份验证。在开发槽托管的应用程序版本具有身份验证,并且运行良好因此,我的客户端应用程序可以获取身份验证令牌并访问受保护的API,并使用托管在开发插槽的服务。当我交换此插槽时,客户端应用程序仍然可以获取身份验证令牌,但无法访问受保护的API。我在使用获取的令牌调用API的任何尝试中都未经授权错误401。
我正在使用docs
中所述的自定义身份验证两个插槽配置相同:身份验证:已启用,请求未经过身份验证时要执行的操作:允许匿名请求,身份验证提供程序:已禁用。据我所知,这些插槽之间唯一的区别是URL。看起来当服务的URL更改时,它会开始生成无效的令牌。
这可能是导致这种行为的原因吗?
答案 0 :(得分:0)
令牌创建过程中涉及的一个参数是hostname。在我的代码中,hostname值是从MobileAppSettings提供的。问题是MobileAppSettings在插槽交换后返回开发槽的主机名值,因此生成的令牌无效。服务重新启动修复了此行为。
答案 1 :(得分:0)
对于遇到此问题的其他人,在使用Azure身份验证和插槽交换时还需要考虑一些其他事项。首先,Azure团队已更正主机名问题,因此所有插槽都具有相同的主机名(您可以在每个插槽的环境设置中对此进行验证)。在一个插槽上生成的令牌现在在所有其他插槽上完全有效。
但是,当生成令牌时,它会存储在每个插槽的硬盘驱动器上的文件夹中,并且该文件夹不会粘贴到特定插槽。这意味着如果您的客户端用户使用生产槽的令牌并交换生产和暂存插槽,则该客户端的令牌WON将再次有效(因为他们在生产槽上的令牌引用是现在在临时插槽上。)
这可能是也可能不是您的应用的问题。如果您要求用户经常登录,那么他们可能甚至没有注意到登录的额外需要。但是,如果你有持久的令牌(像大多数社交网站一样),那么这可能会引起一些麻烦。