0

Я работаю над dll, который используется приложением веб-формы. Одной из особенностей dll является создание Google CalendarService и его использование. Когда я запускаю веб-формы на моем локальном хосте, все работает бесперебойно. Однако, если я запускаю его из Azure сайтовAzure WebSites запрещает доступ к Google Api

метод 'GoogleWebAuthorizationBroker.AuthorizeAsync' бросает HttpListenerException (0x5): Доступ запрещен

Вот трассировки стека:

[HttpListenerException (0x5): Access is denied] 
Microsoft.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +82 
Microsoft.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccess(Task task) +71 
Mosoft.Integrations.CalendarService.<GetCredentials>d__2.MoveNext() +362 

[AggregateException: One or more errors occurred.] 
System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions) +3833113 
System.Threading.Tasks.Task`1.GetResultCore(Boolean aitCompletionNotification) +73 
System.Threading.Tasks.Task`1.get_Result() +10900681 
Mosoft.Integrations.CalendarService.GoogleCalendar..ctor(Int32 userID) +38 
WebFormsDemo.ModalCreate.CreateServices() +35 
WebFormsDemo.ModalCreate.Page_Load(Object sender, EventArgs e) +240 System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +51 
System.Web.UI.Control.OnLoad(EventArgs e) +92 
System.Web.UI.Control.LoadRecursive() +54 
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +772 

И вот как я установил учетные данные

private static async Task<BaseClientService.Initializer> GetCredentials(int userID) 
    { 
     ClientSecrets secrets = new ClientSecrets 
     { 
      ClientId = CLIENT_ID, 
      ClientSecret = CLIENT_SECRET 
     }; 

     UserCredential googleCredential = await GoogleWebAuthorizationBroker.AuthorizeAsync(secrets, 
      new[] { Google.Apis.Calendar.v3.CalendarService.Scope.Calendar }, userID.ToString(), CancellationToken.None, new MyDataStore()); 

     var initializer = new BaseClientService.Initializer 
     { 
      HttpClientInitializer = googleCredential, 
      ApplicationName = "MyCalendar" 
     }; 
     return initializer; 
    } 

Любые предложения, что может быть неправильным? Или указывая на правильное направление?

ответ

0

Чтобы использовать API Google API, вы обычно должны иметь белый список домена, из которого будет поступать запрос API. Вы забыли оформить свой домен в лазурном виде?

+0

Если по белой листинге вы имеете в виду разрешить всем IP-адресам доступ к моему домену, то да, это делается. –

+0

@PauliusSabutis Нет, я имею в виду, что вы должны сказать Google «Эй, я буду получать доступ к вам от« www.mysite.com ». Пожалуйста, –

1

Оба используют учетные записи служб, поэтому я надеюсь, что это вам поможет.

Possability # 1:

При создании сертификата P12, вы попробуйте изменить

var certificate = new X509Certificate2(p12Path, "notasecret", X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable); 

//(notice the X509KeyStorageFlags.MachineKeySet |) 

Possability # 2, аутентификация с использованием службы счетов

string keyFilePath = System.Web.Hosting.HostingEnvironment.MapPath("~/----path to json credentials downloaded using google developer console ---.json"); 
string p12Path = System.Web.Hosting.HostingEnvironment.MapPath("~/---path to p12 certificate ----.p12"); 
string[] scopes = new string[] { 
    CalendarService.Scope.Calendar, // Manage your calendars 
    CalendarService.Scope.CalendarReadonly // View your Calendars 
}; 

     var certificate = new X509Certificate2(p12Path, "notasecret", X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable); 

ServiceAccountCredential credential = new ServiceAccountCredential(
    new ServiceAccountCredential.Initializer("--email generated by google developer console ending with [email protected]") 
    { 
     Scopes = scopes 
    }.FromCertificate(certificate)); 

    CalendarService service = new CalendarService(new BaseClientService.Initializer() 
    { 
     HttpClientInitializer = credential, 
     ApplicationName = "----the project name used from developer console---", 
    }); 
0
UserCredential googleCredential = await GoogleWebAuthorizationBroker.AuthorizeAsync(secrets, 
      new[] { Google.Apis.Calendar.v3.CalendarService.Scope.Calendar }, userID.ToString(), CancellationToken.None, new MyDataStore()); 

Это Безразлично Кажется, это правильный способ аутентификации с помощью веб-приложения. This answer - как я остановил ошибку «Доступ лишен».

Смежные вопросы