【发布时间】:2016-09-01 00:08:29
【问题描述】:
我有一个基于 IS4 身份示例的 IdentityServer4 应用程序,以及一个使用不记名令牌通过 IS4.AccessTokenValidation 进行授权的 API。这通过 VisualStudio 在 localhost 上运行良好,当我部署到 Windows 2012 VM 并通过 IIS 托管时。当我将身份服务器作为应用服务网站部署到 Azure 时,一切都很好。但是,当 API 部署为使用与 VM 相同的域和证书的应用服务时,任何具有 Authorize 属性(有策略或无策略都无关紧要)的方法总是返回带有标头消息的 401:
Www-Authenticate: Bearer error="invalid_token", error_description="The signature key was not found"
我们使用的是 .NET 4.5.2,以及最新版本的 IdentityServer4 和 IdentityServer4.AccessTokenValidation 包。我还从 2016 年 8 月 30 日从 GitHub 中提取了最新的这些包,没有任何变化。无论如何,我认为 IS4 Validator 并不是一个错误,但我不知道是什么可能导致了这种情况。有什么建议么?是 Azure 主机错误吗?
我希望能够对此进行调试,但即使我从头开始重建,我也无法让远程调试对这个应用程序起作用,并且应用程序日志什么也没告诉我。我翻遍了 ASP.NET 安全存储库,但没有更多的日志记录或调试访问权限,我完全不知道如何解决这个问题。
API 配置非常基础:
var jwtBearerOptions = new JwtBearerOptions()
{
Authority = Configuration["Authentication:IdentityServer:Server"],
Audience = Configuration["Authentication:IdentityServer:Server"]+"/resources",
RequireHttpsMetadata = false,
AutomaticAuthenticate = true,
AutomaticChallenge = true,
};
app.UseJwtBearerAuthentication(jwtBearerOptions);
身份服务器直接从样本中提取出来,并使用购买的证书进行签名。
是否有其他人将此配置完全用作 2 Azure 应用服务?或者考虑到发送到 VM 托管 API 的相同不记名令牌,可能导致此错误的原因是可以接受的。
【问题讨论】:
-
在 gitter.im/IdentityServer/IdentityServer3/archives/2015/04/13 上讨论了 idsrv3 的类似情况。我的理解是由于没有获取身份服务器元数据(
.well-known/opened-configuration)而出现问题。此外,对于更多日志记录,请在api中配置 aspnet 核心日志记录(您可以启用它以使用 serilog 将日志写入文本文件)并检查错误日志。 -
该线程中关于令牌大小的有趣可能性。我的相当大,但我希望这对所有主机都是一个问题。将与它玩。您对日志记录是正确的,我将添加 Serilog。看看结果如何。
-
获得更多日志记录是我真正需要的,并查看了安全回购代码。出于某种原因,App Service 上的 SigningKey 验证选项似乎有所不同。
标签: asp.net-core azure-web-app-service bearer-token .net-4.5.2 identityserver4