С# недопустимый тип поставщика с учетной записью службы Google

Я не эксперт в С#, и это мой первый проект с API Google и служебной учетной записью. Я столкнулся с проблемой, которую я понятия не имею, как решить. Этот код работает на 2 компьютерах, но не на 3-м.

Третий компьютер выдает ошибку недействительного прототипа при попытке запуска.
Проверенный код для Документация Google API — Сервисный аккаунт

В чем может быть проблема?

Используемый код:

string[] scopes = new string[] { AnalyticsService.Scope.AnalyticsReadonly };
var keyFilePath = System.AppDomain.CurrentDomain.BaseDirectory + "www.site.nl-012345678.p12";
string serviceAccountEmail = "[email protected]";
string applicationName = "www.applicationname.nl";
string password = "notasecret";

//loading the Key file<br>
var certificate = new X509Certificate2(keyFilePath, password, X509KeyStorageFlags.Exportable);
var credential = new ServiceAccountCredential(
new ServiceAccountCredential.Initializer(serviceAccountEmail)
{
    Scopes = scopes
}.FromCertificate(certificate));

// setup the service
var service = new AnalyticsService(new BaseClientService.Initializer()
{
    HttpClientInitializer = credential,
    ApplicationName = applicationName
});

Изменить (добавлена ​​трассировка стека):

Serverfout in toepassing /.  
Ongeldig providertype opgegeven.
Beschrijving: Er is een onverwerkte uitzondering opgetreden tijdens het uitvoeren van de huidige webaanvraag. Raadpleeg de stacktracering voor meer informatie over deze fout en de oorsprong ervan in de code.

Details van uitzondering: System.Security.Cryptography.CryptographicException: Ongeldig providertype opgegeven.


Fout in bron:


Regel 37:             var certificate = new X509Certificate2(keyFilePath, password, X509KeyStorageFlags.Exportable);
Regel 38:             var credential = new ServiceAccountCredential(new ServiceAccountCredential.Initializer(serviceAccountEmail)
Regel 39:             {
Regel 40:                 Scopes = scopes
Regel 41:             }.FromCertificate(certificate));


Bronbestand: C:\inetpub\wwwroot\git\ttldashboard\ttldashboard\Helpers\GoogleAnalytics.cs    Regel: 39

Stacktracering:


[CryptographicException: Ongeldig providertype opgegeven.
]
   System.Security.Cryptography.Utils.CreateProvHandle(CspParameters parameters, Boolean randomKeyContainer) +5265821
   System.Security.Cryptography.Utils.GetKeyPairHelper(CspAlgorithmType keyType, CspParameters parameters, Boolean randomKeyContainer, Int32 dwKeySize, SafeProvHandle& safeProvHandle, SafeKeyHandle& safeKeyHandle) +94
   System.Security.Cryptography.RSACryptoServiceProvider.GetKeyPair() +136
   System.Security.Cryptography.RSACryptoServiceProvider..ctor(Int32 dwKeySize, CspParameters parameters, Boolean useDefaultKeySize) +203
   System.Security.Cryptography.X509Certificates.X509Certificate2.get_PrivateKey() +240
   Google.Apis.Auth.OAuth2.Initializer.FromCertificate(X509Certificate2 certificate) in C:\Users\cloudsharp\Documents\GitHub\google-api-dotnet-client\Src\Support\GoogleApis.Auth.PlatformServices_Shared\OAuth2\ServiceAccountCredential.cs:115
   ttldashboard.Helpers.GoogleAnalytics.GetAnalyticsService() in C:\inetpub\wwwroot\git\ttldashboard\ttldashboard\Helpers\GoogleAnalytics.cs:39
   ttldashboard.Helpers.GoogleAnalytics.GetGoogleExitClicks(Int32 locatieId, String startDate, String stopDate) in C:\inetpub\wwwroot\git\ttldashboard\ttldashboard\Helpers\GoogleAnalytics.cs:146
   ttldashboard.Controllers.DashboardController.Index() in C:\inetpub\wwwroot\git\ttldashboard\ttldashboard\Controllers\DashboardController.cs:67
   lambda_method(Closure , ControllerBase , Object[] ) +87
   System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +229
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +35
   System.Web.Mvc.Async.AsyncControllerActionInvoker.<BeginInvokeSynchronousActionMethod>b__39(IAsyncResult asyncResult, ActionInvocation innerInvokeState) +39
   System.Web.Mvc.Async.WrappedAsyncResult`2.CallEndDelegate(IAsyncResult asyncResult) +67
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +42
   System.Web.Mvc.Async.AsyncInvocationWithFilters.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3d() +72
   System.Web.Mvc.Async.<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f() +386
   System.Web.Mvc.Async.<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f() +386
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +42
   System.Web.Mvc.Async.<>c__DisplayClass2b.<BeginInvokeAction>b__1c() +38
   System.Web.Mvc.Async.<>c__DisplayClass21.<BeginInvokeAction>b__1e(IAsyncResult asyncResult) +186
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +38
   System.Web.Mvc.Controller.<BeginExecuteCore>b__1d(IAsyncResult asyncResult, ExecuteCoreState innerState) +29
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +65
   System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +53
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +36
   System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +38
   System.Web.Mvc.MvcHandler.<BeginProcessRequest>b__5(IAsyncResult asyncResult, ProcessRequestState innerState) +44
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +65
   System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +38
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +399
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +137


Versiegegevens: Microsoft .NET Framework Versie:4.0.30319; ASP.NET Versie:4.6.1038.0

comment
Не могли бы вы опубликовать более подробную информацию об исключении (внутренние исключения, трассировка стека и т. д.)?   -  person Jevgeni Geurtsen    schedule 12.09.2016
comment
Мы могли бы использовать немного информации о машине, которая не работает. как @JevgeniGeurtsen, нам нужно увидеть полное исключение, которое он выдает.   -  person DaImTo    schedule 12.09.2016
comment
Добавлена ​​полная трассировка стека, этого достаточно?   -  person xAndyx    schedule 12.09.2016
comment
Если вам захочется загрузить файл Json учетной записи службы вместо файла P12. Тогда я могу дать вам другой код для использования?   -  person DaImTo    schedule 12.09.2016
comment
Подробная информация о любых различиях между машинами, которые работают на той, которая не работает, действительно была бы очень полезна.   -  person Jon Skeet    schedule 12.09.2016
comment
Это не обычная лазурная ошибка. обычно это ошибка шлюза или прокси-сервера   -  person DaImTo    schedule 12.09.2016


Ответы (2)


Вероятно, это криптопроблема с сертификатом на этой машине. Если бы я мог воссоздать это, я бы, вероятно, поиграл с ним, просто чтобы увидеть, что его вызывает, но, поскольку я не могу, вот «возможный» способ обойти это.

Перейдите в консоль разработчиков Google. Загрузите файл .Json учетной записи службы вместо файла .p12 учетной записи службы. Тогда используйте этот код вместо

 GoogleCredential credential;
 using (var stream = new FileStream(serviceAccountCredentialFilePath, FileMode.Open, FileAccess.Read))
       {
       credential = GoogleCredential.FromStream(stream)
                    .CreateScoped(scopes);
       }

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

Если вы действительно хотите знать, что может быть причиной этого, я посмотрю, смогу ли я найти кого-нибудь, чтобы пропинговать.

person DaImTo    schedule 12.09.2016
comment
Благодаря переходу на файл json проблема устранена! Кстати, не удалось использовать AnalyticsReportingService(), вместо этого пришлось использовать AnalyticsService(). - person xAndyx; 12.09.2016
comment
AnalyticsReportingService — это Google Analytics v4, это AnalyticsService v3, извините, мне следовало посмотреть на ваш код, а не просто копировать мой. Я обновил ответ правильным сервисом. - person DaImTo; 12.09.2016

У меня была точно такая же проблема (я использую файл P12). Код работал на моем рабочем столе, но затем произошел сбой с ошибкой «недопустимый тип поставщика», когда я развернул его в Azure.

Чего мне не хватало: X509KeyStorageFlags.MachineKeySet

Как это:

string sKeyFile = System.Web.Hosting.HostingEnvironment.MapPath("/Keys/" + ServiceAccountKey);
if (!System.IO.File.Exists(sKeyFile))
{
    throw new Exception("Key file can't be found! " + sKeyFile);
}

var certificate = new X509Certificate2(sKeyFile, "notasecret", 
                   X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet);
person Frog Pr1nce    schedule 30.04.2018