/ / IdentityServer4 Авторизація завжди отримує "Ключ підпису не знайдено" на Azure AppService - asp.net-core, azure-web-сайти, носій-token, .net-4.5.2, identserver4

IdentityServer4 Authorize завжди отримує "ключ підпису не знайдено" на Azure AppService - asp.net-core, azure-web-сайти, носій-токен, .net-4.5.2, identityserver4

У мене є додаток IdentityServer4 на основі IS4Зразок ідентичності та API, що використовує маркери носія для його авторизації через IS4.AccessTokenValidation. Це добре працює на localhost через VisualStudio, і коли я розгортаю до VM Windows 2012 і розміщується через IIS. Коли я розгортаю сервер ідентичності до Azure як веб-сайт служби App, все також добре. Однак, коли API розгорнуто як Служба додатків, використовуючи той же домен та сертифікат, що і VM, будь-який метод із атрибутом Авторизація (з політикою чи жодним значенням не має значення) завжди повертається 401 з повідомленням заголовка:

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?

Я "хотів би налагодити це, але не можу" тзмусити віддалену налагодження працювати над цим додатком, навіть коли я відбудувався з нуля, а журнали додатків нічого не кажуть. У мене було репотання в репортажі 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? Або те, що може спричинити цю помилку, якщо той же маркер носія, який надсилається до розміщеного API VM, є прийнятним.

Відповіді:

3 для відповіді № 1

Виявилося, вам потрібно чітко встановити IssuerSigningKey в TokenValidationParameters. Тому я отримую сертифікат у магазині App Service і додаю його через 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();
...
}

Не маю ідеї, чому це потрібно лише в додатку AzureСервіс, а не на сервері або машині розробки. Хтось ще може це пояснити? Він запропонував би для параметра ValidateIssuerSigningKey встановити значення true для Служби додатків, а неправдиве - будь-де.