Мне необходимо отключить локальную аутентификацию для служб Azure Cognitive, включая ресурс Translator, и перейти на использование TokenCredential
.
В документации нет ни одного упоминания о том, как использовать TokenCredential с ресурсом-переводчиком, хотя TextTranslationClient
можно создать с помощью экземпляра TokenCredential. Как и ожидалось, использование DefaultAzureCredential
приводит к результату 401.
Отключение локальной аутентификации нарушает старую настройку, при которой токен получался путем вызова https://api.cognitive.microsoft.com/sts/v1.0/issueToken
с первичным ключом.
Отключите локальную проверку подлинности для Переводчика Azure.
Согласно MS-Document,
Если вы отключите локальную аутентификацию (аутентификацию по ключу), вам следует использовать только аутентификацию Microsoft entra ID
, что означает, что ресурс должен быть создан с помощью custom subdomain
.
Чтобы пройти аутентификацию с помощью Microsoft entra ID
, я следовал приведенному выше документу и создал ресурс с собственным доменом, используя команду ниже.
Команда:
az cognitiveservices account create -n sampletext901 -g xxxx --kind TextTranslation --sku S1 -l global --custom-domain "venkat123"
После создания конечная точка должна отображать имя субдомена, уникальное для вашего ресурса.
Вывод с конечными точками:
"endpoint": "https://api.cognitive.microsofttranslator.com/",
"endpoints": {
"Container": "https://venkat123.cognitiveservices.azure.com/",
"DocumentTranslation": "https://venkat123.cognitiveservices.azure.com/",
"TextTranslation": "https://venkat123.cognitiveservices.azure.com/",
"TextTranslation-Global": "https://api.cognitive.microsofttranslator.com/",
"Token": "https://venkat123.cognitiveservices.azure.com/"
},
Теперь вам нужно создать регистрацию приложения и назначить Cognitive Services User
, сверившись с приведенным выше документом.
В моей среде я отключил локальную аутентификацию и проверил с помощью команды ниже.
Команда и вывод:
PS /home/venkat> Get-AzCognitiveServicesAccount -ResourceGroupName venkatesan-rg -name sampletext901
ResourceGroupName : venkatesan-rg
AccountName : sampletext901
Id : /subscriptions/xxxx/resourceGroups/venkatesan-rg/providers/Microsoft.CognitiveServices/accounts/sampletext901
Endpoint : https://api.cognitive.microsofttranslator.com/
Location : global
Sku : Microsoft.Azure.Management.CognitiveServices.Models.Sku
AccountType : TextTranslation
ResourceType : Microsoft.CognitiveServices/accounts
Etag : "2500xx-0000-0700-0000-66594c060000"
ProvisioningState : Succeeded
CustomSubDomainName : venkat123
PublicNetworkAccess : Enabled
Identity :
Encryption :
UserOwnedStorage :
PrivateEndpointConnections : {}
ApiProperties :
Properties : Microsoft.Azure.Management.CognitiveServices.Models.AccountProperties
RestrictOutboundNetworkAccess :
AllowedFqdnList :
DisableLocalAuth : True
NetworkRuleSet :
Capabilities : {CustomerManagedKey}
Выход:
Вы можете использовать код ниже, чтобы TextTranslationClient
использовать Microsoft Entra ID с помощью .Net, следуя этому MS-Document.
Код:
using Azure;
using Azure.AI.Translation.Text;
using Azure.Identity;
string endpoint = "https://venkat123.cognitiveservices.azure.com/";
string tenantId = "xxxxx";
string clientId = "xxxx";
string clientSecret = "xxxx";
ClientSecretCredential credential = new ClientSecretCredential(tenantId, clientId, clientSecret);
TextTranslationClient client = new TextTranslationClient(credential, new Uri(endpoint));
try
{
string targetLanguage = "cs";
string inputText = "This is a test.";
Response<IReadOnlyList<TranslatedTextItem>> response = client.Translate(targetLanguage, inputText);
IReadOnlyList<TranslatedTextItem> translations = response.Value;
TranslatedTextItem translation = translations.FirstOrDefault();
Console.WriteLine($"Detected languages of the input text: {translation?.DetectedLanguage?.Language} with score: {translation?.DetectedLanguage?.Confidence}.");
Console.WriteLine($"Text was translated to: '{translation?.Translations?.FirstOrDefault().TargetLanguage}' and the result is: '{translation?.Translations?.FirstOrDefault()?.Text}'.");
}
catch (RequestFailedException exception)
{
Console.WriteLine($"Error Code: {exception.ErrorCode}");
Console.WriteLine($"Message: {exception.Message}");
}
Выход:
Detected languages of the input text: en with score: 1.
Text was translated to: 'cs' and the result is: 'Tohle je test.'.
Привет ! Я столкнулся с той же проблемой, но с rest API. Какую область вы используете для DefaultAzureCredential?
Authorization credential
передать токен oauth2, создав поток учетных данных клиента.
Спасибо! Я думаю, что это работает (нужно копнуть немного дальше). Я делал именно то, что вы описали, но мне не хватало роли
Cognitive Services User
, потому что описание роли в Azure не имеет смысла:Lets you read and list keys of Cognitive Services.
. Роль, назначенная моему SG, похоже, работает с DefaultAzureCredential.