0

Ich versuche, mich mit einer Dienstkonto-P12-Datei bei meinem Google Analytics-Konto zu authentifizieren. Der unten stehende Code sollte für mein Analytics-Konto authentifiziert werden und die benötigten Daten anfordern. Ich erhalte jedoch einen Fehler mit dem X509Certificate2, wenn ich den folgenden Code ausführe. Ich habe meine p12-Datei in bin/debug-Ordner meines Projekts mit angegebenen Anmeldeinformationen abgelegt.CryptographicException mit Dienstkonto p12-Datei

var certificate = new X509Certificate2(keyFilePath, keyPassword, X509KeyStorageFlags.Exportable); 

Ich erhalte die folgende Fehlermeldung:

An unhandled exception of type 'System.Security.Cryptography.CryptographicException' occurred in mscorlib.dll

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using Google.Apis.Analytics.v3; 
using System.Security.Cryptography.X509Certificates; 
using Google.Apis.Auth.OAuth2; 
using Google.Apis.Services; 

namespace GoogleAnalytics 
{ 
    public partial class MainForm : Form 
    { 
     private string keyFilePath = @"CSharpApplication-9f9f7643f6.p12"; 
     private string serviceAccountEmail = "[email protected]"; 
     private string keyPassword = "notasecret"; 
     private string websiteCode = "67881935"; 
     private AnalyticsService service = null; 
     private List<ChartRecord> visitsData = new List<ChartRecord>(); 

     public MainForm() 
     { 
      InitializeComponent(); 
     } 

     private void Authenticate() 
     { 
      //loading the Key file 
      var certificate = new X509Certificate2(keyFilePath, keyPassword, X509KeyStorageFlags.Exportable); 

      var scopes = 
      new string[] { 
      AnalyticsService.Scope.Analytics,    // view and manage your analytics data 
      AnalyticsService.Scope.AnalyticsEdit,   // edit management actives 
      AnalyticsService.Scope.AnalyticsManageUsers, // manage users 
      AnalyticsService.Scope.AnalyticsReadonly};  // View analytics data  

      var credential = new ServiceAccountCredential(new ServiceAccountCredential.Initializer(serviceAccountEmail) 
      { 
       Scopes = scopes 
      }.FromCertificate(certificate)); 

      service = new AnalyticsService(new BaseClientService.Initializer() 
      { 
       HttpClientInitializer = credential 
      }); 
     } 

     private void QueryData() 
     { 
      DataResource.GaResource.GetRequest request = service.Data.Ga.Get(
       "ga:" + websiteCode, 
       DateTime.Today.AddDays(-15).ToString("yyyy-MM-dd"), 
       DateTime.Today.ToString("yyyy-MM-dd"), 
       "ga:sessions"); 
      request.Dimensions = "ga:year,ga:month,ga:day"; 
      var data = request.Execute(); 

      foreach (var row in data.Rows) 
      { 
       visitsData.Add(new ChartRecord(new DateTime(int.Parse(row[0]), int.Parse(row[1]), int.Parse(row[2])).ToString("MM-dd-yyyy"), int.Parse(row[3]))); 
      } 
     } 

     private void PopulateChart() 
     { 
      analyticsChart.Series[0].XValueMember = "Date"; 
      analyticsChart.Series[0].YValueMembers = "Visits"; 
      analyticsChart.DataSource = visitsData; 
      analyticsChart.DataBind(); 
     } 

     private void btnData_Click(object sender, EventArgs e) 
     { 
      Authenticate(); 
      QueryData(); 
      PopulateChart(); 
     } 
    } 
} 

UPDATE: Mit folgendem Code beantwortet bekomme ich Fehler wie

'GoogleAnalytics2.vshost.exe' (CLR v4.0.30319: GoogleAnalytics2.vshost.exe): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll'. Cannot find or open the PDB file. 
'GoogleAnalytics2.vshost.exe' (CLR v4.0.30319: GoogleAnalytics2.vshost.exe): Loaded 'C:\Windows\assembly\GAC_MSIL\Microsoft.VisualStudio.HostingProcess.Utilities\14.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.HostingProcess.Utilities.dll'. Cannot find or open the PDB file. 
'GoogleAnalytics2.vshost.exe' (CLR v4.0.30319: GoogleAnalytics2.vshost.exe): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Windows.Forms\v4.0_4.0.0.0__b77a5c561934e089\System.Windows.Forms.dll'. Cannot find or open the PDB file. 
'GoogleAnalytics2.vshost.exe' (CLR v4.0.30319: GoogleAnalytics2.vshost.exe): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll'. Cannot find or open the PDB file. 
'GoogleAnalytics2.vshost.exe' (CLR v4.0.30319: GoogleAnalytics2.vshost.exe): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Drawing\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Drawing.dll'. Cannot find or open the PDB file. 
'GoogleAnalytics2.vshost.exe' (CLR v4.0.30319: GoogleAnalytics2.vshost.exe): Loaded 'C:\Windows\assembly\GAC_MSIL\Microsoft.VisualStudio.HostingProcess.Utilities.Sync\14.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.HostingProcess.Utilities.Sync.dll'. Cannot find or open the PDB file. 
'GoogleAnalytics2.vshost.exe' (CLR v4.0.30319: GoogleAnalytics2.vshost.exe): Loaded 'C:\Windows\assembly\GAC_MSIL\Microsoft.VisualStudio.Debugger.Runtime\14.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.Debugger.Runtime.dll'. 
'GoogleAnalytics2.vshost.exe' (CLR v4.0.30319: GoogleAnalytics2.vshost.exe): Loaded 'c:\users\star\documents\visual studio 2015\Projects\GoogleAnalytics2\GoogleAnalytics2\bin\Release\GoogleAnalytics2.vshost.exe'. Cannot find or open the PDB file. 
'GoogleAnalytics2.vshost.exe' (CLR v4.0.30319: GoogleAnalytics2.vshost.exe): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Core\v4.0_4.0.0.0__b77a5c561934e089\System.Core.dll'. Cannot find or open the PDB file. 
'GoogleAnalytics2.vshost.exe' (CLR v4.0.30319: GoogleAnalytics2.vshost.exe): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Xml.Linq\v4.0_4.0.0.0__b77a5c561934e089\System.Xml.Linq.dll'. Cannot find or open the PDB file. 
'GoogleAnalytics2.vshost.exe' (CLR v4.0.30319: GoogleAnalytics2.vshost.exe): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Data.DataSetExtensions\v4.0_4.0.0.0__b77a5c561934e089\System.Data.DataSetExtensions.dll'. Cannot find or open the PDB file. 
'GoogleAnalytics2.vshost.exe' (CLR v4.0.30319: GoogleAnalytics2.vshost.exe): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\Microsoft.CSharp\v4.0_4.0.0.0__b03f5f7f11d50a3a\Microsoft.CSharp.dll'. Cannot find or open the PDB file. 
'GoogleAnalytics2.vshost.exe' (CLR v4.0.30319: GoogleAnalytics2.vshost.exe): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_32\System.Data\v4.0_4.0.0.0__b77a5c561934e089\System.Data.dll'. Cannot find or open the PDB file. 
'GoogleAnalytics2.vshost.exe' (CLR v4.0.30319: GoogleAnalytics2.vshost.exe): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Net.Http\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Net.Http.dll'. Cannot find or open the PDB file. 
'GoogleAnalytics2.vshost.exe' (CLR v4.0.30319: GoogleAnalytics2.vshost.exe): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Xml\v4.0_4.0.0.0__b77a5c561934e089\System.Xml.dll'. Cannot find or open the PDB file. 
The thread 0x3714 has exited with code 0 (0x0). 
The thread 0x398c has exited with code 0 (0x0). 
The thread 0x289c has exited with code 0 (0x0). 
'GoogleAnalytics2.vshost.exe' (CLR v4.0.30319: GoogleAnalytics2.vshost.exe): Loaded 'c:\users\star\documents\visual studio 2015\Projects\GoogleAnalytics2\GoogleAnalytics2\bin\Release\GoogleAnalytics2.exe'. Symbols loaded. 
'GoogleAnalytics2.vshost.exe' (CLR v4.0.30319: GoogleAnalytics2.vshost.exe): Loaded 'c:\users\star\documents\visual studio 2015\Projects\GoogleAnalytics2\GoogleAnalytics2\bin\Release\Google.Apis.AnalyticsReporting.v4.dll'. Symbols loaded. 
'GoogleAnalytics2.vshost.exe' (CLR v4.0.30319: GoogleAnalytics2.vshost.exe): Loaded 'c:\users\star\documents\visual studio 2015\Projects\GoogleAnalytics2\GoogleAnalytics2\bin\Release\Google.Apis.dll'. Symbols loaded. 
'GoogleAnalytics2.vshost.exe' (CLR v4.0.30319: GoogleAnalytics2.vshost.exe): Loaded 'c:\users\star\documents\visual studio 2015\Projects\GoogleAnalytics2\GoogleAnalytics2\bin\Release\Google.Apis.Core.dll'. Symbols loaded. 
'GoogleAnalytics2.vshost.exe' (CLR v4.0.30319: GoogleAnalytics2.vshost.exe): Loaded 'c:\users\star\documents\visual studio 2015\Projects\GoogleAnalytics2\GoogleAnalytics2\bin\Release\Google.Apis.Auth.PlatformServices.dll'. Symbols loaded. 
'GoogleAnalytics2.vshost.exe' (CLR v4.0.30319: GoogleAnalytics2.vshost.exe): Loaded 'c:\users\star\documents\visual studio 2015\Projects\GoogleAnalytics2\GoogleAnalytics2\bin\Release\Google.Apis.Auth.dll'. Symbols loaded. 
'GoogleAnalytics2.vshost.exe' (CLR v4.0.30319: GoogleAnalytics2.vshost.exe): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Configuration\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll'. Cannot find or open the PDB file. 
'GoogleAnalytics2.vshost.exe' (CLR v4.0.30319: GoogleAnalytics2.vshost.exe): Loaded 'c:\users\star\documents\visual studio 2015\Projects\GoogleAnalytics2\GoogleAnalytics2\bin\Release\Newtonsoft.Json.dll'. Cannot find or open the PDB file. 
The thread 0x1228 has exited with code 0 (0x0). 
The thread 0x30cc has exited with code 0 (0x0). 
The program '[10788] GoogleAnalytics2.vshost.exe' has exited with code 0 (0x0). 
The program '[10788] GoogleAnalytics2.vshost.exe: Program Trace' has exited with code 0 (0x0). 

wo meine Datei Program.cs

ist
namespace GoogleAnalytics2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      System.Console.WriteLine(ServiceAccountAuthExample.AuthenticateServiceAccount("[email protected]", "C:/Users/star/Downloads/CSharpApplication-9f9f557643f6.p12")); 
     } 
    } 
} 

Bitte helfen Sie mir. Was ich hier vermisse. Jede Hilfe wird geschätzt.

+0

versuchen, Ihren Code ein wenig, X509KeyStorageFlags.MachineKeySet tweeking | X509KeyStorageFlags.Exportable); Wenn das nicht funktioniert, habe ich Code, der die JSON-Datei für Dienstkonten anstelle der p12-Datei verwendet, wenn Sie möchten. – DaImTo

+0

Die Ausnahme kommt mit einer Nachricht, bitte posten Sie diese Nachricht. –

+0

Seitennotiz: Dies ist ein Dienst-Konto, wirklich müssen Sie nur den einen Bereich anfordern. AnalyticsService.Scope.Analytics fragt nach den anderen ist Art von über töten. – DaImTo

Antwort

0

Ich habe Probleme mit der P12-Datei in der Vergangenheit gesehen. Ich muss das Problem noch vollständig diagnostizieren können. Manchmal ist es einfach einfacher, die .json-Datei des Dienstkontos herunterzuladen. Google ruft p12 trotzdem rückwärtskompatibel auf, damit sie eventuell keine p12-Dateien mehr verwenden.

Dies ist die Methode, die ich für die Authentifizierung eines Dienstkontos verwende. Es wird herausfinden, welche Art von Anmeldeinformationen Sie senden.

/// <summary> 
    /// Authenticating to Google using a Service account 
    /// Documentation: https://developers.google.com/accounts/docs/OAuth2#serviceaccount 
    /// </summary> 
    /// <param name="serviceAccountEmail">From Google Developer console https://console.developers.google.com</param> 
    /// <param name="serviceAccountCredentialFilePath">Location of the .p12 or Json Service account key file downloaded from Google Developer console https://console.developers.google.com</param> 
    /// <returns>AnalyticsService used to make requests against the Analytics API</returns> 
    public static AnalyticsService AuthenticateServiceAccount(string serviceAccountEmail, string serviceAccountCredentialFilePath) 
    { 
     try 
     { 
      if (string.IsNullOrEmpty(serviceAccountCredentialFilePath)) 
       throw new Exception("Path to the service account credentials file is required."); 
      if (!File.Exists(serviceAccountCredentialFilePath)) 
       throw new Exception("The service account credentials file does not exist at: " + serviceAccountCredentialFilePath); 
      if (string.IsNullOrEmpty(serviceAccountEmail)) 
       throw new Exception("ServiceAccountEmail is required."); 

      // These are the scopes of permissions you need. It is best to request only what you need and not all of them 
      string[] scopes = new string[] { AnalyticsReportingService.Scope.Analytics };    // View your Google Analytics data 

      // For Json file 
      if (Path.GetExtension(serviceAccountCredentialFilePath).ToLower() == ".json") 
      { 
       GoogleCredential credential; 
       using (var stream = new FileStream(serviceAccountCredentialFilePath, FileMode.Open, FileAccess.Read)) 
       { 
        credential = GoogleCredential.FromStream(stream) 
         .CreateScoped(scopes); 
       } 

       // Create the Analytics service. 
       return new AnalyticsService(new BaseClientService.Initializer() 
       { 
        HttpClientInitializer = credential, 
        ApplicationName = "Analytics Authentication Sample", 
       }); 
      } 
      else if (Path.GetExtension(serviceAccountCredentialFilePath).ToLower() == ".p12") 
      { // If its a P12 file 

       var certificate = new X509Certificate2(serviceAccountCredentialFilePath, "notasecret", X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable); 
       var credential = new ServiceAccountCredential(new ServiceAccountCredential.Initializer(serviceAccountEmail) 
       { 
        Scopes = scopes 
       }.FromCertificate(certificate)); 

       // Create the Analytics service. 
       return new AnalyticsService(new BaseClientService.Initializer() 
       { 
        HttpClientInitializer = credential, 
        ApplicationName = "Analytics Authentication Sample", 
       }); 

      } 
      else 
      { 
       throw new Exception("Unsupported Service accounts credentials."); 
      } 

     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("Create service account AnalyticsService failed" + ex.Message); 
      throw new Exception("CreateServiceAccountAnalyticsServiceFailed", ex); 
     } 
    } 

-Code zerrissen von meinem Tutorial Google Service accounts with Json file

Verbrauch:

var service = AnalyticsService AuthenticateServiceAccount(.....); 
DataResource.GaResource.GetRequest request = service.Data.Ga.Get(
       "ga:" + websiteCode, 
       DateTime.Today.AddDays(-15).ToString("yyyy-MM-dd"), 
       DateTime.Today.ToString("yyyy-MM-dd"), 
       "ga:sessions"); 
      request.Dimensions = "ga:year,ga:month,ga:day"; 
      var data = request.Execute(); 

      foreach (var row in data.Rows) 
      { 
       visitsData.Add(new ChartRecord(new DateTime(int.Parse(row[0]), int.Parse(row[1]), int.Parse(row[2])).ToString("MM-dd-yyyy"), int.Parse(row[3]))); 
      } 
+0

Ich erstellte Konsolenanwendung und aktualisierte Code so bald in Abfrage. Im Run-Modus komme ich wie oben. Das sind keine Fehler. Was soll ich dafür tun? – daisy

+0

Haben Sie das Nuget-Paket hinzugefügt? Ist Ihr Projekt auf .net 4.5 oder höher eingestellt? http://stackoverflow.com/questions/15937707/error-message-cannot-find-oropen-the-pdb-file – DaImTo

+0

Ich denke, Ihr Code ist nur P12-Datei finden und Daten von ihm. Ich werde keine Variable sehen, wo es analytische Daten Statistiken zeigen kann. Wie kann ich Daten wie Seitenaufrufe, Traffic abrufen? – daisy

Verwandte Themen