我们有一个使用 Azure AD 在 Azure 中工作的 .NET Core 应用程序,通过使用以下代码在
startup.cs
文件中启用它:
builder.Services
.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AADConfig"));
我们是 AWS 新手,但需要将 API 发布到 AWS Amplify,其中令牌将由 AWS Cognito 使用 Angular 应用程序颁发,这似乎工作正常。
但现在从 API 端,我需要验证 JWT 令牌。
我尝试用这段代码来做:
builder.Services.AddAuthentication()
.AddJwtBearer(options =>
{
options.SaveToken = true;
options.TokenValidationParameters = new TokenValidationParameters
{
ValidIssuer = configs.Issuer,//"https://cognito-idp.{aws region here}.amazonaws.com/{Cognito UserPoolId here}",
ValidateIssuerSigningKey = true,
ValidateIssuer = true,
ValidateLifetime = true,
ValidAudience = configs.ClientId,
ValidateAudience = true
};
//options.MetadataAddress = configs.KnownKeyUrl;//Knowkye url is like "https://cognito-idp.{aws region here}.amazonaws.com/{Cognito UserPoolId here}/.well-known/openid-configuration";
});
由于令牌将由 Cognito 颁发,我没有密钥,并且不想将其保留在配置或代码中,更喜欢验证颁发者、使用众所周知的配置或其他更好的方式签名密钥
IssuerSigningKey = new SymmetricSecurityKey(key)
我的控制器用属性装饰
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
但是使用上面的代码我不断收到类似的错误
签名无效
或
承载错误=“invalid_token”,error_description=“未找到签名密钥”
我可以使用
CustomerFilter
属性来验证令牌、任何帮助或示例存储库。
截至目前,我们将 APIgateway 或 APIM 作为最后的选择,因为它会增加成本。
非常感谢。
更正了使用 OpenIdConnect(众所周知的 Url)验证签名的代码。 并能够识别 iss = 发行者并获得正确的配置并进行令牌验证以继续身份验证和授权
try { var claimsPrincipal = new JwtSecurityTokenHandler().ValidateToken(jwt, validationParameters, out var rawValidatedToken); return (JwtSecurityToken)rawValidatedToken; // Or, you can return the ClaimsPrincipal (which has the JWT properties automatically mapped to .NET claims) } catch (SecurityTokenValidationException) { // The token failed validation! // TODO: Log it or display an error. }