Недопустимая подпись JWT на Linux контейнере. Net Core 2.2 - PullRequest
0 голосов
/ 25 марта 2020

Я работал над реализацией аутентификации на основе однонаправленного канала JWT. Я пытаюсь получить ключи publi c с URL-адреса JWKS сервера аутентификации и загрузить его в JsonWebKeySet. Вот мой код класса ConfigureServices:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddCors(o=> { o.AddPolicy("AllowAnyOrigin", b=> b.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader()); });
        services.Configure<MvcOptions>(o => { o.Filters.Add(new CorsAuthorizationFilterFactory("AllowAnyOrigin")); });
        var p = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();
        services.AddMvc(o=> {
            o.Filters.Add(new AuthorizeFilter(p));
        }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

        // configure strongly typed settings objects
        var appSettingsSection = Configuration.GetSection("AppSettings");
        services.Configure<AppSettings>(appSettingsSection);

        // configure jwt authentication
        var appSettings = appSettingsSection.Get<AppSettings>();
        //var key = Encoding.ASCII.GetBytes(appSettings.Secret);

        //Call Auth service URL to get public keys
        var jwksJson = Helpers.GetKeyAsync(appSettings.jwksURL).GetAwaiter().GetResult();

        //load keys from JWKS
        var jwks = new JsonWebKeySet(jwksJson);

        var issuerSigningKeys = jwks.Keys.ToList();

        services.AddAuthentication(x =>
        {
            x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        })
        .AddJwtBearer(x =>
        {
            x.RequireHttpsMetadata = false;
            x.SaveToken = true;
            x.TokenValidationParameters = new TokenValidationParameters
            {
                ValidateIssuerSigningKey = true,
                IssuerSigningKeys = issuerSigningKeys,
                //IssuerSigningKey = new SymmetricSecurityKey(key),
                ValidateIssuer = false,
                ValidateAudience = false
            };
        });

        // configure DI for application services
        services.AddScoped<IUserService, UserService>();
    }

А вот мой метод Configure

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseCors("AllowAnyOrigin");
        app.UseAuthentication();
        app.UseMvc();
    }

Этот код прекрасно работает, когда я запускаю API на локальном компьютере (IIS Express) ) с моим angular интерфейсом и почтальоном. Однако при развертывании этого кода в контейнере Linux на основе Openshift я всегда получаю сообщение об ошибке 401: «Подпись недействительна». Я использую один и тот же токен для аутентификации как в локальном, так и в Openshift контейнере. Хотите знать, если контейнер на основе Linux вызывает проблему.

...