0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Azure Data Factory の REST API コネクタのサービス プリンシパル認証の設定

Last updated at Posted at 2023-12-22

サービス プリンシパル認証で REST を使う際の設定のドキュメントで、テーブルのこの列の意味がよくわからないので、たぶんこれが正解だろうという設定をメモしておきます。
自分で調べたい方は Integration Runtime を VM で用意して Fiddler をインストールして proxy (127.0.0.1 ポート 8888) を通すようにすると HTTP通信の中身が見れます。Fiddler は Tools の Opitions から [Decrypt HTTPS traffic] を有効にしておきましょう。

Property Description Required
aadResourceId 認可を要求する Microsoft Entra リソースを指定します (たとえば、https://management.core.windows.net)。 はい

このプロパティは Entra ID 認証時に scope で使われ、最終的にアクセストークンの aud 属性に入って認可時に検証されることになります。一般的な REST API では認可を行うアプリケーションの URL になるはずですが、動作はアプリケーションの作りに依存します。
今回は Azure Functions の AppService 認証で試したのですが、この環境ではサービス プリンシパル認証のために登録したアプリケーションのアプリケーション(クライアント)IDを指定すると動きました。 Entra ID のアプリの登録で各アプリの概要から取得することができます。

Azure Data Factory の UI では、ここを設定する際の
image.png

この設定です。
image.png

ベースURL はアクセスする REST API の URL で、みなさんが使いたい REST API アプリケーションの URLを指定します。コネクタは Entra ID で認証を行い、トークンを受け取った後に、トークンと共にこの URL にアクセスします。
その他のフィールドは Entra ID の アプリの登録 にアクセスし、サービスプリンシパル認証用のアプリの [概要] から取得することができます。

認証のリクエストと応答で各フィールドがどのように使われるかは次の通りです。

POST の Body

接続をテストするとコネクタは login.microsoftonline.com に次の POST を投げます。

client_id=b42eeb35-9bd2-4d5c-a57e-9a1a12a69831&client_secret=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&scope=b42eeb35-9bd2-4d5c-a57e-9a1a12a69831%2F.default&grant_type=client_credentials
  • client_id: [サービスプリンシパルID] フィールド
  • client_secret: [サービスプリンシパルキー] フィールド
  • scope: [AADリソース] フィールド

AAD リソースは認証のスコープに使われます。これにはアプリケーション(クライアント)IDを設定します。REST API の URL とか、api://<アプリケーション ID> のほうがいいのでは?という疑問が浮かぶのですが、Azure Functions の App Service 認証ではこれらは動作しませんでした。正確には検証の途中で api://... でうまくいくこともあった気がするのですが、なんかうまくいかなくなったのでやめました。年末まで時間もないですし。

応答

応答はこんな感じで帰ってきます。access_token は JWT エンコードされているのでデコードします。

{
  "token_type":"Bearer",
  "expires_in":3599,
  "ext_expires_in":3599,
  "access_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6IjVCM25SeHRRN2ppOGVORGMzRnkwNUtmOTdaRSIsImtpZCI6IjVCM25SeHRRN2ppOGVORGMzRnkwNUtmOTdaRSJ9.eyJhdWQiOiJiNDJlZWIzNS05YmQyLTRkNWMtYTU3ZS05YTFhMTJhNjk4MzEiLCJpc3MiOiJodHRwczovL3N0cy53aW5kb3dzLm5ldC9kYTlhZGIzNi0wZDkwLTQ2N2QtYTBkZi02ODc5YjQ1ZmZlYzYvIiwiaWF0IjoxNzAzMjEwOTA2LCJuYmYiOjE3MDMyMTA5MDYsImV4cCI6MTcwMzIxNDgwNiwiYWlvIjoiRTJWZ1lKaXRiYnRuemRaSDdQeWJxeSsybnJGaEF3QT0iLCJhcHBpZCI6ImI0MmVlYjM1LTliZDItNGQ1Yy1hNTdlLTlhMWExMmE2OTgzMSIsImFwcGlkYWNyIjoiMSIsImlkcCI6Imh0dHBzOi8vc3RzLndpbmRvd3MubmV0L2RhOWFkYjM2LTBkOTAtNDY3ZC1hMGRmLTY4NzliNDVmZmVjNi8iLCJvaWQiOiIzNTc2YjAyNS04MTMzLTRlNDQtOWRlZS0yY2JiZDRkYjFjNTIiLCJyaCI6IjAuQVc4QU50dWEycEFOZlVhZzMyaDV0Rl8teGpYckxyVFNtMXhOcFg2YUdoS21tREhSQUFBLiIsInN1YiI6IjM1NzZiMDI1LTgxMzMtNGU0NC05ZGVlLTJjYmJkNGRiMWM1MiIsInRpZCI6ImRhOWFkYjM2LTBkOTAtNDY3ZC1hMGRmLTY4NzliNDVmZmVjNiIsInV0aSI6IkFhLUFZU3RGNDBhVHdhOWNXMVZDQVEiLCJ2ZXIiOiIxLjAifQ.U3l89wcNe7NtiJq2fZ3Grux_rVf62RUVamcwYWYLqerxnajD-4AMaPG6h3pmvwG68MpXgA1y-u1ygsbWCatMRSMdyIWaSQJM6l9piKoOkkKEg6iLRmnN9a7A5ax6XSR3mfTUkmFwRq21VBBs2g08su1H9vgsLNdngRauJofXCbLHA9ZhRF4DwW6qaz-aN2r4372x-TtptSF9yPiGmJIjLgFU8wwCcISRW9bz_HvKszG8bAKY9w48sRSKkVc-vP3wht69gYAgP3VbtFrY0ci46UjErmyKM5-uSZ8ZOkwGmHU_48h-XlxPTPFJmT5xfy54mjnVMT4flYr6lb-5j-mY-g"
  }

accecc_token をデコードしたもの

ヘッダー

ヘッダーです。

{
  "typ": "JWT",
  "alg": "RS256",
  "x5t": "5B3nRxtQ7ji8eNDc3Fy05Kf97ZE",
  "kid": "5B3nRxtQ7ji8eNDc3Fy05Kf97ZE"
}

ペイロード

ペイロードの aud にscopeの中身 (=AADリソース) が入ってきます。

{
  "aud": "b42eeb35-9bd2-4d5c-a57e-9a1a12a69831",
  "iss": "https://sts.windows.net/da9adb36-0d90-467d-a0df-6879b45ffec6/",
  "iat": 1703210906,
  "nbf": 1703210906,
  "exp": 1703214806,
  "aio": "E2VgYJitbbtnzdZH7Pybqy+2nrFhAwA=",
  "appid": "b42eeb35-9bd2-4d5c-a57e-9a1a12a69831",
  "appidacr": "1",
  "idp": "https://sts.windows.net/da9adb36-0d90-467d-a0df-6879b45ffec6/",
  "oid": "3576b025-8133-4e44-9dee-2cbbd4db1c52",
  "rh": "0.AW8ANtua2pANfUag32h5tF_-xjXrLrTSm1xNpX6aGhKmmDHRAAA.",
  "sub": "3576b025-8133-4e44-9dee-2cbbd4db1c52",
  "tid": "da9adb36-0d90-467d-a0df-6879b45ffec6",
  "uti": "Aa-AYStF40aTwa9cW1VCAQ",
  "ver": "1.0"
}

これは認可側でチェックが行われますが、Azure Functions の AppService 認証ではアプリケーションのアプリケーション(クライアント)ID と比較をするようで、これと違っていると認証に失敗します。 カスタム ドメインを使っているような場合にはそれを指定したい気もしますが、こんなエラーになります。

Rest call failed with client error, status code 401 Unauthorized, please check your activity settings. Request URL: https://adfconnection.mscocula.com/api/httptrigger1. Response: {"code":401,"message":"IDX10214: Audience validation failed. Audiences: 'https:\/\/adfconnection.mscocula.com'. Did not match: validationParameters.ValidAudience: 'b42eeb35-9bd2-4d5c-a57e-9a1a12a69831' or validationParameters.ValidAudiences: 'null'."} アクティビティ ID: 29de8b1d-9ca9-49c0-ae18-38a480e388d5

エラーについてはフォーラムにも投稿があります。
https://learn.microsoft.com/en-us/answers/questions/1168505/azuread-token-authentication-not-checking-allowed

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?