У мене є додаток 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 для Служби додатків, а неправдиве - будь-де.