2016-12-06 10 views
1

Я ищу простой способ проверки произвольную строку подключения Azure Table, которая использует SAS, такие как один ниже с помощью Java SDK в Azure Storage в:Проверка Azure Table SAS на основе учетных данных

https://example.table.core.windows.net/example?sig=aaabbbcccdddeeefffggghhh%3D&se=2020-01-01T00%3A00%3A00Z&sv=2015-04-05&tn=example&sp=raud

Я попробовал кучу разных методов, выставленных CloudTable api, но ни один из них не работает.

  • CloudTable.exists() бросает StorageException, независимо от того, являются ли действительные учетные данные

  • getName(), getStorageUri(), getUri() и другие добытчики - все работают на местном уровне, независимо от полномочий

  • getServiceClient().downloadServiceProperties() и getServiceClient().getServiceStats() также бросают различные исключения, а getServiceClient().getEndpoint() и getServiceClient().getCredentials() и другие всегда работают локально.

  • Почему я не просто запрашиваю таблицу для строки или двух? Ну, во многих случаях мне нужно проверить SAS, который дает только сообщения для записи или обновления (без разрешений delete или read), и я не хочу выполнять инструкцию, которая что-то изменяет в таблице только для проверки учетных данных.

ответ

1

Чтобы ответить на ваши вопросы:

CloudTable.exists() бросает StorageException, независимо от того, является ли действительные учетные данные

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

GetName(), getStorageUri(), getUri() и другие добытчики - все работы локально, независимо от полномочий

Они будут работать, поскольку они не делают сетевой вызов. Они просто используют имеющиеся в них данные в разных переменных экземпляра и возвращают данные.

getServiceClient(). DownloadServiceProperties() и getServiceClient(). GetServiceStats() также бросать различные исключения, в то время как getServiceClient(). GetEndpoint() и getServiceClient(). GetCredentials() и другие всегда работают на местном уровне ,

Для того, чтобы getServiceClient().someMethod() работать с использованием SAS, вам нужно будет Account SAS вместо Service SAS (который вы используете прямо сейчас).

Почему я не просто запрашиваю таблицу для строки или двух?Ну, во многих случаях Мне нужно проверить SAS, который дает только сообщения о записи или обновлении (без разрешения на удаление или чтение), и я не хочу выполнять оператор , который изменяет что-то в таблице только для проверки учетных данных ,

Одним из возможных способов проверки правильности использования маркера SAS для операции записи является выполнение операции записи, которая, как вы знаете, завершится с ошибкой. Например, вы можете попробовать вставить объект, который уже существует. В этом случае вы должны получить ошибку Conflict (409). Другая вещь, которую вы могли бы попытаться сделать, - выполнить оптимистичную запись, указав некоторое случайное значение Etag и проверить на ошибку Precondition Failed (412). Если вы получите ошибку 403 или ошибку 404, это будет означать, что что-то не так с вашим токеном SAS.

+0

Спасибо. Вопрос не в том, почему какой-либо из этих вещей не работает, я просто упомянул некоторые вещи, которые я уже пробовал. Вопрос заключается в том, чтобы предложить рабочее решение. Решение 'Conflict' будет работать, но мне нужно выполнить вставку или узнать заранее, какой PartitionKey + RowKey уже существует в таблице. Etag - интересная идея, но я не мог заставить ее работать - мне удалось вставить фиктивные объекты с полностью случайными Etags, что снова требует вставки, чтобы проверить, действительно ли координаты и учетные данные действительны. Я что-то упускаю? – Malt

+0

Теперь я смущен :). Таким образом, вы хотите проверить действительность токена SAS без каких-либо вставок или обновлений или, в этом случае, какой-либо сетевой операции. Правильно ли я понимаю? –

+0

Я никогда не говорил «без какой-либо сетевой операции», что было бы явно невозможно. Я просто не хочу менять состояние таблицы каждый раз, когда я проверяю SAS. Я ищу операцию, которая ничего не меняет в таблице. Например, с Azure Queue, downloadAttributes() подходит для счета - нет изменения состояния, и он не работает, если SAS неверен. – Malt