Проблема аутентификации MSAL при развертывании функции Azure (Python v1), но работает локально

У меня уже довольно давно развернута функция Azure. Функция написана на Python и использует модель v1. Я читаю данные из базы данных в Azure Synapse, используя субъект-службу. Сегодня до 10 утра по центральному стандартному времени это работало без проблем. Однако по прошествии вышеупомянутого времени я начал видеть в журналах 500 ошибок сервера. Сообщение об ошибке указывает следующее (как будто оно передает пустого пользователя):

      Result: Failure Exception: InterfaceError: ('28000', "[28000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Login failed for user ''. (18456) (SQLDriverConnect)") Stack: File "/azure-functions-host/workers/python/3.10/LINUX/X64/azure_functions_worker/dispatcher.py", line 475, in _handle__invocation_request call_result = await self._run_async_func( File "/azure-functions-host/workers/python/3.10/LINUX/X64/azure_functions_worker/dispatcher.py", line 758, in _run_async_func return await ExtensionManager.get_async_invocation_wrapper( File "/azure-functions-host/workers/python/3.10/LINUX/X64/azure_functions_worker/extension.py", line 147, in get_async_invocation_wrapper result = await function(**args) File "/home/site/wwwroot/TestTrigger/__init__.py", line 58, in main sqlRoutesOutput = currentRoutes.synapseSql(); File "/home/site/wwwroot/classes/nexsql.py", line 32, in synapseSql synConn = pyodbc.connect(synConnString, attrs_before = {SQL_COPT_SS_ACCESS_TOKEN:tokenstruct})

А это блок кода:

       def synapseSql(self):
        creds = ConfidentialClientApplication(
            client_id=os.environ['clientid'], 
            authority=f"https://login.microsoftonline.com/{os.envion['tenantid']}",
            client_credential= os.environ['sqlcreds'])

        token = creds.acquire_token_for_client(scopes=['https://database.windows.net/.default'])

        tokenb = bytes(token["access_token"], "UTF-8")
        exptoken = b''
        for i in tokenb:
            exptoken += bytes({i})
            exptoken += bytes(1)
        tokenstruct = struct.pack("=i", len(exptoken)) + exptoken
        SQL_COPT_SS_ACCESS_TOKEN = 1256 

        synConnString = 'DRIVER={ODBC Driver 17 for SQL Server};' \
                    + f'SERVER={self.server};' \
                    + f'DATABASE={self.database};'\
                    + 'ENCRYPT=Yes;'

        synConn = pyodbc.connect(synConnString, attrs_before = {SQL_COPT_SS_ACCESS_TOKEN:tokenstruct})
        cursor = synConn.cursor()
        cursor.execute(self.query)
        return cursor

Как видите, я использую ConfidentialClientApplication для создания кредитов и получения токена. А затем, используя последующий код, который я нашел здесь для структуры токена.

Пожалуйста, дайте мне знать, если я могу предоставить дополнительную информацию, чтобы помочь.

Спасибо!

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

0 ответов

Другие вопросы по тегам