記事公開日
Azure AI Search (旧称 "Azure Cognitive Search")で権限制御してみた2

はじめに
※以前の記事(Azure AI Search (旧称 "Azure Cognitive Search")で権限制御してみた)
検証してみた結果、通常のBlob Storageファイルに対しても使用できましたので、その方法をご紹介したいと思います。
事前にAzure AI Searchのポータル画面から「データのインポート」を使用してインデックス等作成した後、以下の対応を行います。
・セキュリティ用のフィールドを用意する
・用意したセキュリティ用のフィールドに値を設定する
・トークンを指定して検索する
セキュリティ用のフィールドを用意する
ポータル画面にてインデックスJSONエディターを表示し、以下のJSONを追加します。 {
"name": "UserIds",
"type": "Collection(Edm.String)",
"searchable": true,
"filterable": true,
"retrievable": false,
"stored": true,
"sortable": false,
"facetable": true,
"key": false,
"permissionFilter": "userIds",
"synonymMaps": []
},
{
"name": "GroupIds",
"type": "Collection(Edm.String)",
"searchable": true,
"filterable": true,
"retrievable": false,
"stored": true,
"sortable": false,
"facetable": true,
"key": false,
"permissionFilter": "groupIds",
"synonymMaps": []
},
permissionFilterがポイントのようです。また、typeを見ていただくと分かる通りコレクションになっていますので複数指定することが可能です。用意したセキュリティ用のフィールドに値を設定する
本来は、スキルセットやインデクサーを用いて用意したフィールドに値を設定するところですが、検証ですのでREST APIを用いて値を更新していきます。使用したPowerShellスクリプトは以下の通りです。
# パラメータの設定
$serviceName = "<Azure AI Search名>"
$indexName = "<インデックス名>"
$apiVersion = "2025-05-01-preview"
$adminKey = "<管理キー>"
# リクエストの URL の作成
$url = "https://$serviceName.search.windows.net/indexes/$indexName/docs/index?api-version=$apiVersion"
# ヘッダーの設定
$headers = @{
"Content-Type" = "application/json"
"api-key" = $adminKey
}
# ボディの設定 (ここにインデックスするドキュメントの JSON データを指定)
$body = @"
{
"value": [
{
"@search.action": "merge",
"metadata_storage_path": "<更新対象のmetadata_storage_path>",
"UserIds": ["<ユーザーのオブジェクトID>"]
#"GroupIds": ["<グループのオブジェクトID>"]
}
]
}
"@
# POST リクエストの送信
$response = Invoke-RestMethod -Method Post -Uri $url -Headers $headers -Body $body
# レスポンスの表示
$response | ConvertTo-Json
こちらを用いて事前に用意していた3ファイルに権限を設定してみました。| No | ファイル名 | UserIds | GroupIds |
| 1 | 桃太郎.pdf | 自身のオブジェクトIDを指定 | 空 |
| 2 | 浦島太郎.pdf | 空 | 自身が所属するグループのオブジェクトIDを指定 |
| 3 | 金太郎.pdf | 空 | 空 |
トークンを指定して検索する
検索する際に通常の問い合わせで3ファイルとも検索対象になってしまいますが、ヘッダーに「x-ms-query-source-authorization」を追加することで自身がアクセス許可された文書のみを対象に検索することが可能です。使用したPowerShellスクリプトは以下の通りです。
# パラメータの設定
$endpoint = "<Azure AI SearchのエンドポイントURL>"
$indexName = "<インデックス名>"
$apiVersion = "2025-05-01-preview"
$searchToken ="<トークン>"
# リクエストの URL の作成
$url = "$endpoint/indexes/$indexName/docs/search?api-version=$apiVersion"
# ヘッダーの設定
$headers = @{
"Authorization" = "Bearer $searchToken"
"x-ms-query-source-authorization" = $searchToken
"Content-Type" = "application/json"
}
# ボディの設定
$body = @"
{
"search": "*"
}
"@
# POST リクエストの送信
$response = Invoke-RestMethod -Method Post -Uri $url -Headers $headers -Body $body
# レスポンスの表示
$response | ConvertTo-Json
※トークンは以下のコマンドから取得しました。
az login az account get-access-token --scope https://search.azure.com/.default
結果は以下の通り、桃太郎.pdfと浦島太郎.pdfのみ取得できていることが分かると思います。

まとめ
要望の多いSharePointのコンテンツ検索についてもこの機能が応用できそうですので、近い将来SharePointも対応してくれることを心待ちにしたいと思います。
QUICK E-Solutions では、各AIサービスを利用したシステム導入のお手伝いをしております。それ以外でも様々なアプリケーションの開発・導入を行っております。提供するサービス・ソリューションにつきましては こちら に掲載しております。
システム開発・構築でお困りの問題や弊社が提供するサービス・ソリューションにご興味を抱かれましたら、是非一度 お問い合わせ ください。
※このブログで参照されている、Microsoft、Azure AI Search、Azure OpenAI、Document Intelligence、その他のマイクロソフト製品およびサービスは、米国およびその他の国におけるマイクロソフトの商標または登録商標です。
※その他の会社名、製品名は各社の登録商標または商標です。


