GoogleアナリティクスAPIを使用しており、このSOの質問に従ってOAuthを設定しています: https://stackoverflow.com/a/13013265/129936
ここに私の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を確認しましたが、正しい場所を指しています。
何か案は?これがサーバー、ファイル、コード、または何に問題があるのかわかりません。
私の頭に浮かぶものの1つは、アプリプールのIDです。ユーザープロファイルの読み込みがオンになっていることを確認してください。オンにしないと、暗号サブシステムが機能しません。
_p12
_ファイルをロードしています
_new X509Certificate2(
HostingEnvironment.MapPath(@"~/App_Data/GoogleAnalytics-privatekey.p12"), ....
_
File.Exists(filename)
がtrueを返したにもかかわらず、実際にFileNotFoundExceptionを受け取りました。
@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パラメーターを設定すると、このフォルダーにキーファイルが作成されます。私の場合、このフォルダの許可に違いがありました。上記のフォルダーにプールアカウントは追加されませんでした。