この記事では、Azure Digital Twins へのサービス要求から 404 エラーを受信した場合の原因と解決手順について説明します。 この情報は、Azure Digital Twins サービスに固有のものです。
症状
このエラーは、インスタンスとは異なる Microsoft Entra テナント に属するサービス プリンシパルまたはユーザー アカウントを使用して Azure Digital Twins インスタンスにアクセスするときに発生する可能性があります。 正しいロールが ID に割り当てられているように見えますが、API 要求はのエラー状態 404 Sub-Domain not found
で失敗します。
原因
原因 #1
Azure Digital Twins では、すべての認証ユーザーが Azure Digital Twins インスタンスと同じ Microsoft Entra テナントに属している必要があります。
結果として、Azure Digital Twins API への要求には、Azure Digital Twins インスタンスが存在するのと同じテナントの一部であるユーザーまたはサービス プリンシパルが必要です。 Azure Digital Twins エンドポイントの悪意のあるスキャンを防ぐために、送信元テナントの外部からのアクセス トークンを使用した要求では、"404 Sub-Domain が見つかりません" というエラー メッセージが返されます。 このエラーは、ユーザーまたはサービス プリンシパルに Microsoft Entra B2B コラボレーションによって Azure Digital Twins データ所有者または Azure Digital Twins データ閲覧者ロールが付与された場合でも返されます。
ソリューション
解決策 #1
この問題を解決するには、別のテナントの各フェデレーション ID で Azure Digital Twins インスタンスの "ホーム" テナントからのトークンを要求します。
これを実行する方法の 1 つとして、次の CLI コマンドを使用します。ここで、<home-tenant-ID>
は、Azure Digital Twins インスタンスを含む Microsoft Entra テナントの ID です。
az account get-access-token --tenant <home-tenant-ID> --resource https://digitaltwins.azure.net
この要求の後、ID は、Azure Digital Twins インスタンスに対して一致するテナント ID 要求を持つ、 https://digitaltwins.azure.net
Microsoft Entra リソースに対して発行されたトークンを受け取ります。 API 要求または Azure.Identity
コードでこのトークンを使用すると、フェデレーション ID が Azure Digital Twins リソースにアクセスできるようになります。
解決策 #2
コードで DefaultAzureCredential
クラスを使用していて、トークンを取得した後もこの問題が引き続き発生する場合は、認証の既定値が別の種類に設定される場合でもテナントを明確にするための DefaultAzureCredential
オプションでホーム テナントを指定できます。
次の例は、InteractiveBrowserTenantId
オプションで DefaultAzureCredential
のサンプル テナント ID 値を設定する方法を示しています。
public class DefaultAzureCredentialOptionsSample
{
// The URL of your instance, starting with the protocol (https://)
private const string adtInstanceUrl = "https://<your-Azure-Digital-Twins-instance-URL>";
private static DefaultAzureCredentialOptions credentialOptions = new DefaultAzureCredentialOptions()
{
ExcludeSharedTokenCacheCredential = true,
ExcludeVisualStudioCodeCredential = true,
TenantId = "<your-Azure-Active-Directory-tenant-ID>"
};
private static DefaultAzureCredential credential = new DefaultAzureCredential(credentialOptions);
DigitalTwinsClient client = new DigitalTwinsClient(new Uri(adtInstanceUrl), credential);
}
Visual Studio と Visual Studio Code での認証のためにテナントを設定する場合にも、同様のオプションが用意されています。 使用可能なオプションの詳細については、DefaultAzureCredentialOptions のドキュメントを参照してください。
次のステップ
Azure Digital Twins のセキュリティとアクセス許可の詳細を確認します。