【发布时间】:2022-02-15 00:16:14
【问题描述】:
我有一个核心托管 API,它使用 IdentityServer 并向我的基于桌面的客户端发出 JwtBearer 令牌。这通常可以正常工作,我可以按预期登录并使用该应用程序。
但是,在使用 Azure 部署槽时,由于颁发者验证,我遇到了问题。
在交换槽时,azure 不会交换正在运行的代码,而只是交换指向 url,以便预热运行的应用程序准备好立即处理请求。但是,Identity Server 实现似乎保留了对 OLD slot URL 的引用,并将其用作颁发者验证的一部分。
这意味着一旦交换了插槽,不仅所有客户端都有效地注销(这已经够糟糕了),而且当客户端再次登录时,身份服务器提供的令牌甚至都无效,因为它是为颁发者获取了错误的 URI。
这会导致错误:
Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler: IdentityServerJwtBearer 未通过身份验证。失败信息: IDX10205:颁发者验证失败。发行人: 'https://my-app-name.azurewebsites.net'。不匹配: 验证参数.ValidIssuer: 'https://my-app-name-deployment.azurewebsites.net' 或 validationParameters.ValidIssuers: 'null'。
我已尝试通过在设置中执行此操作来禁用颁发者验证:
services.AddAuthentication(options =>
{
})
.AddCookie()
.AddJwtBearer(options =>
{
options.TokenValidationParameters.ValidateIssuer = false;
})
.AddIdentityServerJwt();
但是这似乎没有任何区别。我是否将此变量设置在错误的位置?是否还需要配置其他设置才能绕过此检查?
我还尝试将 ValidIssuers 列表设置为在希望任何一个都被接受并允许令牌被任一插槽验证,但这似乎没有任何区别。
或者,有没有办法阻止 IdentityServer 缓存颁发者网址 - 或者有办法在不重新启动应用程序的情况下刷新该缓存?目前,一旦交换插槽,我可以让桌面应用程序访问 API 的唯一方法是重新启动 API 应用程序,然后再次登录(只是注销并登录仍然会导致服务器无法验证的令牌,即使虽然服务器刚刚发出它)。
我觉得我一定错过了一些明显的东西,但我看不出它是什么......
【问题讨论】:
标签: azure-web-app-service identityserver4