目的と概要
SAML認証の動作確認や属性値の追加や確認を目的とします。
そのために、簡単に認証と属性値の取得ができないか調査したところ、Python3-samlというライブラリにFlaskで動作させるサンプルがあったので、IdPをAzureADとして動作確認した。
AzureAD(IdP)
AzureのサブスクリプションまたはOffice365のサブスクリプションを作成すると割り当てられるAzureAD Freeが必要です。
- AzurePortalからAzureADに入ります。
- エンタープライズアプリケーション
- 新しいアプリケーション
- 独自のアプリケーションの作成
- 任意のアプリケーションの名前を入力
- ギャラリーに見つからないその他のアプリケーションを統合します(ギャラリー以外)にチェック
- 作成をクリック
- エンタープライズアプリケーションとして登録されるのでクリックする
- シングルサインオンまたは「シングルサインオンの設定 作業開始」ボタンをクリックする
- SAMLボタンをクリックする
- 識別子(エンティティID)をhttp://localhost:5000/metadata/ を設定
- 応答URL(AssertionConsumerServiceURL)をhttp://localhost:5000/?acs を設定
- ログインURLはSP側のsetting.json内のidpのsingleSignOnServiceのURL値として使用するためメモする
- AzureAD識別子も同じくidpのentityIdの値として使用するためメモする
- ログアウトURLも同じくidpのsingleLogoutServiceの値として使用するためメモする
- 証明書(Base64)をダウンロードする
- ダウンロードしたファイルをエディタで開き、BEGINとEND行以外の文字列をメモする。この文字列はx509certで使用する
クライアントWebサーバー(SP)
SPは以下の環境で動作確認しました。
- Windows10
- Python3.9
- Flask
- Python3-saml
Python3-samlは公式サイトからダウンロードしました。
SP側のSAMLの設定
python3-saml\demo-flask\samlフォルダのsettings.jsonを編集します。AzureADの設定の際に作成したメモを使用します。
{
"strict": true,
"debug": true,
"sp": {
"entityId": "http://localhost:5000/metadata/",
"assertionConsumerService": {
"url": "http://localhost:5000/?acs",
"binding": "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
},
"singleLogoutService": {
"url": "http://localhost:5000/?sls",
"binding": "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect"
},
"NameIDFormat": "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified",
"x509cert": "",
"privateKey": ""
},
"idp": {
"entityId": "<AzureAD EntityID >",
"singleSignOnService": {
"url": "<AzureAD SSO Service >",
"binding": "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect"
},
"singleLogoutService": {
"url": "<AzureAD SingleLogout Service String >",
"binding": "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect"
},
"x509cert": " <AzureAD_X509_String> "
}
}
Flask起動
次のコマンドで環境変数にモジュールとオブジェクトを設定して、Flask起動です。
FLASK_APP="index:app"
py -3 -m flask run
動作確認
動作確認はブラウザから実行します。
- http://localhost:5000 にアクセスする
- ログインボタンをクリックしてログインする
- MicrosoftのサインインIDとパスワードを入力しAzureADの設定に応じてMFAになります。
- サインイン後に属性値が表示されればログイン成功です。
つまづいたこと
- 必ずインターネットからのインバウンド通信があると勘違いして、AzureAppServiceなどが必須だと思っていた
- そのため、クラウド上で実行しようとしていたがうまくいかなかった
- AppService(Linux)のxmlsec1というPythonライブラリがうまく動かないため実行できませんでした
- AzureADでユーザー割当が必要