1
0

More than 3 years have passed since last update.

AzureADでSAML認証を試す

Posted at

目的と概要

SAML認証の動作確認や属性値の追加や確認を目的とします。
そのために、簡単に認証と属性値の取得ができないか調査したところ、Python3-samlというライブラリにFlaskで動作させるサンプルがあったので、IdPをAzureADとして動作確認した。

AzureAD(IdP)

AzureのサブスクリプションまたはOffice365のサブスクリプションを作成すると割り当てられるAzureAD Freeが必要です。

  1. AzurePortalからAzureADに入ります。
  2. エンタープライズアプリケーション
  3. 新しいアプリケーション
  4. 独自のアプリケーションの作成
  5. 任意のアプリケーションの名前を入力
  6. ギャラリーに見つからないその他のアプリケーションを統合します(ギャラリー以外)にチェック
  7. 作成をクリック
  8. エンタープライズアプリケーションとして登録されるのでクリックする
  9. シングルサインオンまたは「シングルサインオンの設定 作業開始」ボタンをクリックする
  10. SAMLボタンをクリックする
  11. 識別子(エンティティID)をhttp://localhost:5000/metadata/ を設定
  12. 応答URL(AssertionConsumerServiceURL)をhttp://localhost:5000/?acs を設定
  13. ログインURLはSP側のsetting.json内のidpのsingleSignOnServiceのURL値として使用するためメモする
  14. AzureAD識別子も同じくidpのentityIdの値として使用するためメモする
  15. ログアウトURLも同じくidpのsingleLogoutServiceの値として使用するためメモする
  16. 証明書(Base64)をダウンロードする
  17. ダウンロードしたファイルをエディタで開き、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

動作確認

動作確認はブラウザから実行します。

  1. http://localhost:5000 にアクセスする
  2. ログインボタンをクリックしてログインする
  3. MicrosoftのサインインIDとパスワードを入力しAzureADの設定に応じてMFAになります。
  4. サインイン後に属性値が表示されればログイン成功です。

つまづいたこと

  • 必ずインターネットからのインバウンド通信があると勘違いして、AzureAppServiceなどが必須だと思っていた
  • そのため、クラウド上で実行しようとしていたがうまくいかなかった
  • AppService(Linux)のxmlsec1というPythonライブラリがうまく動かないため実行できませんでした
  • AzureADでユーザー割当が必要
1
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
1
0