Ответ 1
Одна из вещей, которая приходит мне на ум - это идентификатор вашего пула приложений, убедитесь, что включен Загрузить пользовательский профиль, иначе криптоподсистема не работает.
Я использую API Google Analytics, и я выполнил этот вопрос SO, чтобы настроить OAuth: qaru.site/info/52157/...
Вот мой код 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 - это путь к файлу закрытого ключа, предоставленному Google API Console. Это отлично работает на моей локальной машине, но когда я подталкиваю ее на наш тестовый сервер, я получаю
System.Security.Cryptography.CryptographicException: An internal error occurred.
со следующей трассировкой стека (ненужные части удалены):
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
Итак, похоже, что у него возникли проблемы с загрузкой файла. Я проверил PrivateKeyPath, который был передан, и он указывает на правильное местоположение.
Любые идеи? Я не знаю, если это проблема с сервером, файлом, кодом или чем-то.
Одна из вещей, которая приходит мне на ум - это идентификатор вашего пула приложений, убедитесь, что включен Загрузить пользовательский профиль, иначе криптоподсистема не работает.
Я загружаю файл p12
new X509Certificate2(
HostingEnvironment.MapPath(@"~/App_Data/GoogleAnalytics-privatekey.p12"), ....
На самом деле я получил исключение FileNotFoundException, хотя File.Exists(filename)
возвратил true.
Как @Wiktor Zychla сказал это так же просто, как включение Load User Profile
Здесь изображение настройки, которая нуждается в изменении
Просто щелкните правой кнопкой мыши на пуле приложений в разделе "Пулы приложений" в IIS и выберите "Дополнительные настройки", а нужный вам параметр находится на полпути вниз.
Совет. Я бы рекомендовал комментировать ваш код с этим, чтобы предотвратить трату времени впустую, так как это неясно, если вы никогда не сталкивались с этим раньше.
// If this gives FileNotFoundException see
// http://stackoverflow.com/questions/14263457/
Также попробуйте указать X509KeyStorageFlags
var certificate = new X509Certificate2(KeyFilePath, KeyFilePassword,
X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet |
X509KeyStorageFlags.Exportable);
Как уже упоминалось выше, вам нужно настроить IIS, но как наш случай, некоторое время вам нужно проверить разрешение следующей папки:
C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys
Если вы установите параметр X509KeyStorageFlags, он создаст файл ключа в этой папке. В моем случае была разница в разрешении этой папки. Учетная запись пула не была добавлена в указанную папку.
Нет, это "File.Exists(...)" также в расширенных настройках? У меня было 3 пула, все они были включены для "Загрузить профиль пользователя". Я думаю, что моя проблема может иметь какое-то отношение к зависимостям и пакетам NuGet, поскольку код работает отлично, как приложение консоли, но дает мне проблемы в MVC.