Проверка токена FireBase OAuth Bearer в. NET WebApi в конце концов завершается неудачно после некоторого времени работы - PullRequest
0 голосов
/ 05 апреля 2020

У меня возникла проблема, из-за которой проверка токена не удалась через какое-то время (я думаю, именно тогда, когда это меняется, но обычно считается в днях). Перезапуск приложения решает проблему, поэтому я думаю, что что-то не так с тем, как я инициализирую вещи.

Я использую Firebase, ниже приведен код начальной загрузки, который запускается при запуске приложения. Я прочитал в комментарии к этому старому сообщению { ссылка }, что Google вращает сертификаты, так что теперь я думаю, что может быть проблема? Я получаю сертификаты только один раз за время существования приложения. Если это так, как бы я мог обновлять sh это время от времени, так как это работает только при запуске?

public void ConfigureAuthentication(IAppBuilder app)
{
    var issuerSigningKeys = GetIssuerSigningKeys();
    var firebaseAdminProjectId = ConfigurationManager.AppSettings.Get("FirebaseAdminProjectId");
    app.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions()
    {
        AuthenticationMode = AuthenticationMode.Active,
        AllowedAudiences = new[] { firebaseAdminProjectId },
        Provider = new OAuthBearerAuthenticationProvider
        {
            OnValidateIdentity = context =>
            {
                context.OwinContext.Set<bool>("OnValidateIdentity", true);
                return Task.FromResult(0);
            }
        },
        TokenValidationParameters = new TokenValidationParameters
        {
            IssuerSigningKeys = issuerSigningKeys,
            ValidAudience = firebaseAdminProjectId,
            ValidIssuer = ConfigurationManager.AppSettings.Get("FirebaseAdminValidIssuer"),
            IssuerSigningKeyResolver = (arbitrarily, declaring, these, parameters) => issuerSigningKeys
        }
    });


}

private static List<X509SecurityKey> GetIssuerSigningKeys()
{
    HttpClient client = new HttpClient();
    var task = client.GetStringAsync("https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com"));
    task.Wait();
    string jsonResult = task.Result;

    //Extract X509SecurityKeys from JSON result
    List<X509SecurityKey> x509IssuerSigningKeys = JObject.Parse(jsonResult)
                        .Children()
                        .Cast<JProperty>()
                        .Select(i => BuildSecurityKey(i.Value.ToString())).ToList();

    return x509IssuerSigningKeys;
}

private static X509SecurityKey BuildSecurityKey(string certificate)
{
    //Removing "-----BEGIN CERTIFICATE-----" and "-----END CERTIFICATE-----" lines
    var lines = certificate.Split('\n');
    var selectedLines = lines.Skip(1).Take(lines.Length - 3);
    var key = string.Join(Environment.NewLine, selectedLines);

    return new X509SecurityKey(new X509Certificate2(Convert.FromBase64String(key)));
}

1 Ответ

0 голосов
/ 22 апреля 2020

Я думаю, что я наконец-то понял это.

Прежде всего, ключи подписи, кажется, поворачиваются каждые 5 дней, потому что у них есть свойство validity, установленное с датой. Это имеет смысл с шаблоном, который я вижу ...

Однако я думаю, что проблема в моем коде. Свойство TokenValidationParameters IssuerSigningKeyResolver ожидает делегата. Но я получаю ключи и присваиваю их переменной, которая, в свою очередь, присваивается свойству. Таким образом, «resolver» всегда разрешает возвращенные начальные ключи. Они никогда не перефразируют sh. Исправление заключается в том, чтобы просто присвоить свойству метод GetIssuerSigningKeys () вместо этого:

IssuerSigningKeyResolver = (arbitrarily, declaring, these, parameters) => GetIssuerSigningKeys()
...