J'utilise l'API Google Analytics et j'ai suivi cette SO question pour configurer OAuth: https://stackoverflow.com/a/13013265/129936
Voici mon OAuth:
public void SetupOAuth ()
{
var Cert = new X509Certificate2(
PrivateKeyPath,
"notasecret",
X509KeyStorageFlags.Exportable);
var Provider = new AssertionFlowClient(GoogleAuthenticationServer.Description, Cert)
{
ServiceAccountId = ServiceAccountUser,
Scope = ApiUrl + "analytics.readonly"
};
var Auth = new OAuth2Authenticator<AssertionFlowClient>(Provider, AssertionFlowClient.GetState);
Service = new AnalyticsService(Auth);
}
PrivateKeyPath est le chemin du fichier de clé privée fourni par Google API Console. Cela fonctionne parfaitement sur ma machine locale, mais quand je la pousse vers notre serveur de test, je reçois
System.Security.Cryptography.CryptographicException: An internal error occurred.
avec la trace de pile suivante (parties non pertinentes supprimées):
System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr) +33
System.Security.Cryptography.X509Certificates.X509Utils._LoadCertFromFile(String fileName, IntPtr password, UInt32 dwFlags, Boolean persistKeySet, SafeCertContextHandle& pCertCtx) +0
System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromFile(String fileName, Object password, X509KeyStorageFlags keyStorageFlags) +237
System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(String fileName, String password, X509KeyStorageFlags keyStorageFlags) +140
Metrics.APIs.GoogleAnalytics.SetupOAuth() in <removed>\Metrics\APIs\GoogleAnalytics.cs:36
Metrics.APIs.GoogleAnalytics..ctor(String PrivateKeyPath) in <removed>\Metrics\APIs\GoogleAnalytics.cs:31
Il semble donc qu'il ait du mal à charger le fichier. J'ai vérifié le PrivateKeyPath qui est transmis et il pointe vers l'emplacement correct.
Des idées? Je ne sais pas si c'est un problème avec le serveur, le fichier, le code ou quoi.
Une des choses qui me vient à l'esprit est l'identité de votre pool d'applications, assurez-vous que Charger le profil utilisateur est activé sinon le sous-système de cryptographie ne fonctionne pas.
Je charge mon fichier p12
Avec
new X509Certificate2(
HostingEnvironment.MapPath(@"~/App_Data/GoogleAnalytics-privatekey.p12"), ....
J'ai en fait obtenu une FileNotFoundException même si File.Exists(filename)
a renvoyé true.
Comme l'a dit @Wiktor Zychla, c'est aussi simple que d'activer Load User Profile
Voici une image du paramètre qui doit être modifié
Faites un clic droit sur le pool d'applications sous "Pools d'applications" dans IIS et sélectionnez "Paramètres avancés" et le paramètre dont vous avez besoin est à mi-chemin environ.
Astuce: je recommanderais de commenter votre code avec cela pour éviter de perdre du temps car il est si obscur si vous ne l'avez jamais rencontré auparavant.
// If this gives FileNotFoundException see
// http://stackoverflow.com/questions/14263457/
Essayez également de spécifier X509KeyStorageFlags
var certificate = new X509Certificate2(KeyFilePath, KeyFilePassword,
X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet |
X509KeyStorageFlags.Exportable);
Comme mentionné ci-dessus, vous devez configurer IIS mais comme dans notre cas, vous devez parfois vérifier l'autorisation du dossier suivant:
C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys
Si vous définissez le paramètre X509KeyStorageFlags, il créera un fichier de clé dans ce dossier. Dans mon cas, il y avait une différence dans l'autorisation de ce dossier. Le compte de pool n'a pas été ajouté dans le dossier mentionné.