При развертывании ASP.NET в облаке Windows Azure приложение выдает ошибку при работе в облаке

Я пытаюсь развернуть приложение ASP.NET в облаке Windows Azure. Я использую Google API для одного из вызовов в приложении. Когда я это сделаю, я получаю следующую ошибку:

System.UnauthorizedAccessException: доступ к пути 'Google.Apis.Auth' запрещен.

ASP.NET не авторизован для доступа к запрошенному ресурсу. Рассмотрите возможность предоставления прав доступа к ресурсу удостоверению запроса ASP.NET. ASP.NET имеет базовое удостоверение процесса (обычно {MACHINE} \ ASPNET в IIS 5 или сетевая служба в IIS 6 и IIS 7, а также настроенное удостоверение пула приложений в IIS 7.5), которое используется, если приложение не олицетворяет. Если приложение олицетворяет через, удостоверением будет анонимный пользователь (обычно IUSR_MACHINENAME) или аутентифицированный пользователь запроса.

Чтобы предоставить ASP.NET доступ к файлу, щелкните файл правой кнопкой мыши в проводнике, выберите «Свойства» и перейдите на вкладку «Безопасность». Щелкните Добавить, чтобы добавить соответствующего пользователя или группу. Выделите учетную запись ASP.NET и установите флажки для желаемого доступа.

Я попытался исследовать это, но все предложения касаются изменения настроек сервера IIS, к которым я не думаю, что у меня есть доступ, поскольку он работает в облаке. Кто-нибудь может помочь?

РЕДАКТИРОВАТЬ: вот код функции, которая выдает ошибку:

 Async Function SpecialTest() As Task(Of String)

    Dim credential As UserCredential
    Dim clientSecretsPath As String = Server.MapPath("~/App_Data/client_secret.json")
    Dim scopes As IList(Of String) = New List(Of String)()
    scopes.Add(CalendarService.Scope.Calendar)
    Dim stream As FileStream = New FileStream(clientSecretsPath, System.IO.FileMode.Open, System.IO.FileAccess.Read)

    Using stream
        credential = Await GoogleWebAuthorizationBroker.AuthorizeAsync(GoogleClientSecrets.Load(stream).Secrets, scopes, "user3", CancellationToken.None)
    End Using


    Dim baseInitializer = New BaseClientService.Initializer()
    With baseInitializer
        .HttpClientInitializer = credential
        .ApplicationName = "P1"
    End With

    Dim service = New CalendarService(baseInitializer)


    Dim Calendars = (Await service.CalendarList.List().ExecuteAsync()).Items()
    Dim toReturn As String = "{""items"": ["
    For Each firstCalendar As CalendarListEntry In Calendars


        If firstCalendar IsNot Nothing Then
            ' Get all events from the first calendar.
            Dim calEvents = Await service.Events.List(firstCalendar.Id).ExecuteAsync()
            ' DO SOMETHING
            Dim items = calEvents.Items
            'Return JsonConvert.SerializeObject(calEvents)
            For Each ite As Google.Apis.Calendar.v3.Data.Event In items
                If Not (ite.Location Is Nothing) And Not (ite.Start Is Nothing) Then
                    Dim tst = ite.Start.DateTime
                    toReturn = toReturn + " [""" + Date.Parse(ite.Start.DateTime).ToShortDateString + """" + "," + """" + ite.Location + """" + "," + """" + ite.Start.DateTime + """" + "," + """" + ite.Start.DateTime + """" + "," + """""],"
                End If
            Next

        End If
    Next
    toReturn = toReturn.Substring(0, toReturn.Length - 1)
    Return toReturn + "]}"
End Function`

person Art F    schedule 17.11.2013    source источник
comment
Прежде чем пытаться ответить, не могли бы вы подробнее рассказать о вызове Google API? Ожидаете ли вы, что он будет взаимодействовать с известным / неизвестным местом в файловой системе (как кажется)?   -  person DavideB    schedule 18.11.2013
comment
@DavideB Я так не думал, есть 2 вызова, первый для аутентификации через Oauth, а второй использует Calendar API для извлечения определенных данных из Google Calendar. Он действительно читает файл JSON как часть процедуры, не уверен, что это считается «взаимодействием с файловой системой».   -  person Art F    schedule 18.11.2013
comment
Упомянутый вами файл JSON физически находится в файловой системе? Например, где он находится, когда вы тестируете его локально в структуре разработки?   -  person DavideB    schedule 18.11.2013
comment
@DavideB Это внутри проекта, в папке App_Data.   -  person Art F    schedule 18.11.2013
comment
Может API пытается что-то написать. Можете ли вы показать, как вы выполняете Oauth и календарный запрос? Вы используете FileDataStore?   -  person LostInComputer    schedule 18.11.2013
comment
@LostInComputer Я добавил код, если он помогает, насколько мне известно, он не пытается ничего хранить ... на самом деле, возможно, OAuth2 пытается где-то сохранить токен? ..   -  person Art F    schedule 19.11.2013
comment
Похоже, у вас нет прав в папке App_Data.   -  person Thiago Custodio    schedule 19.11.2013
comment
Я посмотрю, и я начинаю верить, основываясь на комментариях здесь, что API Google Oauth пытается записать токен безопасности в каталог по умолчанию, который не имеет разрешений в Azure. Я постараюсь взглянуть на это позже сегодня.   -  person Art F    schedule 19.11.2013
comment
Реализация FileDataStore по умолчанию хранит файл в Environment.SpecialFolder.ApplicationData. Вы можете использовать свою собственную реализацию IDataStore, например, используя базу данных. Я могу изменить реализацию FileDataStore в следующем выпуске, который будет настраивать Environment.SpecialFolder.ApplicationData. Имеет смысл?   -  person peleyal    schedule 20.11.2013
comment
Я ожидал, что исключение маскирует фактический исходный источник - сборка Google.Apis.Auth, скорее всего, имеет ссылку или полагается на то, что либо отсутствует, либо требует более высокого уровня доверия для доступа. Разверните этот раздел кода с некоторой дополнительной отладкой, которая перебирает внутренние исключения, пока вы не дойдете до источника и не распечатаете трассировку стека на экран.   -  person Simon W    schedule 20.11.2013
comment
Вы можете попробовать выдать себя за другое лицо программно. Это может помочь. Если вас интересует, я могу опубликовать класс, который использует олицетворение, и я использую его много.   -  person kostas ch.    schedule 22.11.2013
comment
Можете ли вы опубликовать трассировку стека исключения?   -  person Panagiotis Kanavos    schedule 26.11.2013


Ответы (3)


Попробуй это.

A. Если у вас есть доступ по протоколу RDP к облаку Azure, измените настройки IIS.

  • 1. Перейти к IIS
  • 2. Под сайтами выберите сайт по умолчанию.
  • 3.Добавить разрешение
  • 4. выберите объект I_User и предоставьте доступ для чтения / записи.
  • 5. позже вы можете автоматизировать эту настройку с помощью командного файла и запуска задача.

B. Думаю, вы используете любой локальный путь. Вы должны изменить это на локальное хранилище для временных требований и хранилище BLOB-объектов для длительного использования. < / а>

person sudhAnsu63    schedule 21.11.2013

У меня была аналогичная проблема, и я понял, что мне нужно создать собственное хранилище IDataStore с использованием хранилища BLOB-объектов Windows Azure. Мое решение написано на C #, но я разместил свой файл класса здесь: https://groups.google.com/d/msg/google-api-dotnet-client/s7i6mkMjX-M/p_4YlaOyLp4J Может быть, это поможет вам, если вы еще не нашли другого решения .

person Angela Rogers    schedule 14.01.2014

Оберните код, использующий credential, в оператор using. Закрытие оператора using удаляет ресурсы в операторе using, поэтому, когда вы пытаетесь получить доступ / использовать credential позже в коде, он уже был удален.

person viperguynaz    schedule 20.11.2013
comment
Еще нет в заявлении using? Вы можете показать мне, как это выглядит? - person Art F; 21.11.2013