У меня возникла проблема, из-за которой проверка токена не удалась через какое-то время (я думаю, именно тогда, когда это меняется, но обычно считается в днях). Перезапуск приложения решает проблему, поэтому я думаю, что что-то не так с тем, как я инициализирую вещи.
Я использую 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)));
}