.net core 承载错误=“;无效的“U令牌”;,错误描述=";签名无效;

.net core 承载错误=“;无效的“U令牌”;,错误描述=";签名无效;,.net-core,azure-active-directory,asp.net-core-2.0,asp.net-core-webapi,.net Core,Azure Active Directory,Asp.net Core 2.0,Asp.net Core Webapi,我有一个从azure请求令牌的angular应用程序。登录很顺利,我得到了一个令牌。此令牌现在从angular应用程序发送到net core webapi应用程序。Net核心应验证此令牌,但失败。我认为webapi还应该联系azure来验证令牌,因为它不知道验证令牌所需的私钥和公钥 目前还不清楚它为什么会失败。angular应用程序和webapi都在我的计算机上本地运行 错误为:Microsoft.IdentityModel.Tokens.SecurityTokenInvalidSignatur

我有一个从azure请求令牌的angular应用程序。登录很顺利,我得到了一个令牌。此令牌现在从angular应用程序发送到net core webapi应用程序。Net核心应验证此令牌,但失败。我认为webapi还应该联系azure来验证令牌,因为它不知道验证令牌所需的私钥和公钥

目前还不清楚它为什么会失败。angular应用程序和webapi都在我的计算机上本地运行

错误为:
Microsoft.IdentityModel.Tokens.SecurityTokenInvalidSignatureException:'IDX10500:签名验证失败。没有提供安全密钥来验证签名。“

我的net core 2配置为:

var tokenValidationParameters = new TokenValidationParameters
            {

                RequireExpirationTime = true,
                RequireSignedTokens = false,
                ValidateIssuerSigningKey = true,
                ValidateIssuer = true,
                ValidIssuer = "8d708afe-2966-40b7-918c-a39551625958",
                ValidateAudience = true,
                ValidAudience = "https://sts.windows.net/a1d50521-9687-4e4d-a76d-ddd53ab0c668/",
                ValidateLifetime = false,
                ClockSkew = TimeSpan.Zero
            };
            services.AddAuthentication(options =>
            {
                options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;

            }).AddJwtBearer(options =>
            {

                options.Audience = "8d708afe-2966-40b7-918c-a39551625958";
                options.ClaimsIssuer = "https://sts.windows.net/a1d50521-9687-4e4d-a76d-ddd53ab0c668/";
                options.RequireHttpsMetadata=false;
                options.TokenValidationParameters = tokenValidationParameters;
                options.SaveToken = true;
            });

您的TokenValidationParameters中缺少
IssuerSigningKey
属性。这就是它抱怨的原因

最简单的例子是

IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("yOURsECRETkEY12345"))
我不确定azure是如何发挥作用的,如果这是您的签名权限,您可能需要它来检索安全密钥信息

编辑:

Azure特定设置

.AddJwtBearer(options => {
        options.Authority = string.Format("https://login.microsoftonline.com/tfp/{0}/{1}/v2.0/", Configuration["Authentication:AzureAd:Tenant"], Configuration["Authentication:AzureAd:Policy"]);
        options.Audience = Configuration["Authentication:AzureAd:ClientId"];
    });

这是您拥有的相当多的配置:)

两个强制设置是受众和权限:

services
    .AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(o =>
    {
        o.Audience = "8d708afe-2966-40b7-918c-a39551625958";
        o.Authority = "https://login.microsoftonline.com/a1d50521-9687-4e4d-a76d-ddd53ab0c668/";
    });

您缺少授权,因此它不知道从何处加载签名公钥。

根据问题,OP没有使用您的答案适用的AAD B2C。对于上述部分,AAD不使用对称密钥,而是使用非对称密钥。无论如何,你也不应该硬编码。@juunas因此,最简单的例子是,在我看来,提及授权并让它自动加载正确的签名密钥要简单得多。@juunas同意。你能为新访问者分享修复方法吗?你能创建一个新问题,详细说明你所做的事情吗?[此链接]{}解决了这个问题。我正在发布一个令牌,但当它返回进行验证时,弹出无效令牌错误,API响应401Ahh您有多个方案:)不,我只有一个JWT授权您还可以使用TokenValidationParameters.ValidAudiences添加其他访问群体url。例如,当调用方使用IdentifierURI作为范围来请求令牌时,默认的访问群体检查将失败,因为访问群体是应用程序的应用程序Id<代码>c#options.TokenValidationParameters.Validudiences=新字符串[]{“[IdentifierURI]”