gpt4 book ai didi

asp.net-core - IdentityServer4 Authorize 在 Azure AppService 上始终获取 "The signature key was not found"

转载 作者:行者123 更新时间:2023-12-02 02:18:30 30 4
gpt4 key购买 nike

我有一个基于 IS4 身份示例的 IdentityServer4 应用程序,以及一个使用不记名 token 通过 IS4.AccessTokenValidation 进行授权的 API。这通过 VisualStudio 在本地主机上运行良好,当我部署到 Windows 2012 VM 并通过 IIS 托管时,运行良好。当我将身份服务器作为应用服务网站部署到 Azure 时,一切都很好。但是,当使用与 VM 相同的域和证书将 API 部署为应用服务时,任何具有 Authorize 属性的方法(无论是否有策略)始终返回 401 以及 header 消息:

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 Security 存储库,但没有更多日志记录或调试访问权限,我对如何解决此问题一无所知。

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 的相同不记名 token 是可接受的,则可能导致此错误的原因是可以接受的。

最佳答案

事实证明,您需要在 TokenValidationParameters 中显式设置 IssuerSigningKey。因此,我从应用服务存储中获取证书,并通过 JwtBearerOptions.TokenValidationParameters 添加它。所以启动配置如下所示:

        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
...
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap = new Dictionary<string, string>();
var tokenValidationParameters = new TokenValidationParameters
{
// The signing key must match!
ValidateIssuerSigningKey = true,
IssuerSigningKey = new X509SecurityKey(GetSigningCertificate()),

// Validate the JWT Issuer (iss) claim
ValidateIssuer = false,
//ValidIssuer = "local",

// Validate the JWT Audience (aud) claim
ValidateAudience = false,
//ValidAudience = "ExampleAudience",

// Validate the token expiry
ValidateLifetime = true,

// If you want to allow a certain amount of clock drift, set that here:
ClockSkew = TimeSpan.Zero
};
var jwtBearerOptions = new JwtBearerOptions()
{
Authority = Configuration["Authentication:IdentityServer:Server"],
Audience = Configuration["Authentication:IdentityServer:Server"]+"/resources",
RequireHttpsMetadata = false,

AutomaticAuthenticate = true,
AutomaticChallenge = true,

TokenValidationParameters = tokenValidationParameters
};
app.UseJwtBearerAuthentication(jwtBearerOptions);

app.UseMvc();
...
}

不知道为什么只在 Azure 应用服务上需要,而不是在服务器或开发计算机上。还有人能解释一下吗?它建议 ValidateIssuerSigningKey 对于应用服务默认为 true,而在其他地方默认为 false。

关于asp.net-core - IdentityServer4 Authorize 在 Azure AppService 上始终获取 "The signature key was not found",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39260843/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com