3

У меня есть приложение IdentityServer4 на основе образца IS4 Identity и API с использованием токенов-носителей для его авторизации через IS4.AccessTokenValidation. Это отлично работает на localhost через VisualStudio, а когда я развертываю VMware Windows 2012 и размещаюсь через IIS. Когда я развертываю сервер Identity на Azure в качестве веб-сайта службы приложений, все тоже в порядке. Однако, когда API развертывается как Служба приложений с использованием того же домена и сертификата, что и виртуальная машина, любой метод с атрибутом Authorize (с политикой или без него) всегда возвращает 401 с сообщением заголовка:IdentityServer4 Авторизоваться всегда получает «Ключ подписи не найден» в Azure AppService

Www-Authenticate: Bearer error="invalid_token", error_description="The signature key was not found" 

Мы используем .NET 4.5.2 с последними версиями пакетов IdentityServer4 и IdentityServer4.AccessTokenValidation. Я также вытащил последние из этих пакетов из GitHub с 30/08/16 без каких-либо изменений. Я не думаю, что это ошибка IS4 Validator в любом случае, но я не знаю, что может вызвать это. Какие-либо предложения? Это ошибка хозяина Azure?

Мне бы очень хотелось отлаживать это, но я не могу заставить Remote Debug работать в этом приложении, даже когда я перестраивал с нуля, и журналы приложений ничего не говорят мне. У меня был рывок в репозитории 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 App Services? Или то, что может вызвать эту ошибку, при условии, что один и тот же токен-носитель, отправленный в размещенный в VM API, является приемлемым.

+0

Аналогичный случай для idsrv3 обсуждался на https://gitter.im/IdentityServer/IdentityServer3/archives/2015/04/13. Я понимаю, что проблема возникает из-за отсутствия метаданных сервера идентификации ('.well-known/open-configuration'). Кроме того, для большего количества протоколирования настройте ведение журнала ядра aspnet в вашем 'api' (вы можете включить его для записи в текстовый файл с помощью serilog) и проверить журналы ошибок. –

+0

Интересная возможность в этой теме о размере токена. Шахта довольно большая, но я ожидаю, что это проблема на всех хостах. Будет играть с ним. Вы правы насчет регистрации, я добавлю Serilog. Посмотрите, что выйдет. – user1587195

+0

Получение большего количества журналов было тем, что мне действительно нужно, и просмотром кода репозитория безопасности. По-видимому, по какой-то причине должна быть разница в параметрах проверки SigningKey в службе приложений. – user1587195

ответ

3

Оказалось, что вам необходимо явно установить IssuerSigningKey в TokenValidationParameters. Поэтому я получаю сертификат из магазина App Store и добавляю его через 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(); 
     ... 
    } 

не знаю, почему это нужно только на Лазурном App службы, а не на машине сервера или разработки. Может ли кто-нибудь еще объяснить это? Он предположил бы, что ValidateIssuerSigningKey по умолчанию - true для службы приложений и false в другом месте.