Bearer error =“invalid_token”,error_description =“签名无效”

时间:2018-02-23 09:26:46

标签: .net-core azure-active-directory asp.net-core-2.0 asp.net-core-webapi

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

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

错误是:Microsoft.IdentityModel.Tokens.SecurityTokenInvalidSignatureException: 'IDX10500: Signature validation failed. No security keys were provided to validate the signature.'

我的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;
            });

2 个答案:

答案 0 :(得分:3)

你有很多配置:)

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

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

您缺少权限,因此它不知道从哪里加载签名公钥。

答案 1 :(得分:-1)

您在 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"];
    });