#背景
前提記事:Django + Shibboleth with RemoteUserMiddleware
IdPによっては、urnで表すことのできない独自attributeを提供する場合も大いにあり得る。大企業などで社内ネットにSSOを実装している場合は独自attributeを持つ場合が多い(従業員番号、本部名など)。
#attribute-map.xml設定
name
は独自attribute名。nameFormat
をIdPが指定する形式にする必要がある。一般的には、urn:oasis:names:tc:SAML:2.0:attrname-format:basic
でおおよそ対応できそうだ。
...
<Attribute name="X-Am-USERNAME" id="xusername" nameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic"/>
...
#shibboleth2.xmlの設定
例えば上で設定したxusername
を環境変数REMOTE_USER
に格納したい場合は次のようにする。
...
<ApplicationDefaults entityID="https://localhost/"
REMOTE_USER = "xusername" # ← 変更
cipherSuites="DEFAULT:!EXP:!LOW:!aNULL:!eNULL:!DES:!IDEA:!SEED:!RC4:!3DES:!kRSA:!SSLv2:!SSLv3:!TLSv1:!TLSv1.1">
...
#実験
前提記事:Apache + OneLogin SSO with Shibboleth
試しに、OneLoginから独自attributeをassertionに入れてみる。
独自の適当な名前を設定して「Include in SAML assertion」にチェックを入れる。
値は「Macro」とでもしておいて、適当な文字列を設定する。
Saveすれば完了。SAML Tracerで見るとSAML応答に先ほど設定した独自assertionが含まれていることがわかる。
Issuer = https://app.onelogin.com/saml/metadata/~~~~
Subject = ************@yahoo.co.jp
NameID = ************@yahoo.co.jp
AttributeStatement:
* urn:oid:1.3.6.1.4.1.5923.1.1.1.6 = ************@yahoo.co.jp
* urn:oid:0.9.2342.19200300.100.1.3 = ************@yahoo.co.jp
* urn:oid:2.5.4.4 = *****
* X-Am-USERNAME = free_text_here
* urn:oid:2.5.4.42 = *******
環境変数REMOTE_USER
に値が入っていれば成功。
REMOTE_USER: free_text_here
関連記事:Django + Shibboleth with RemoteUserMiddleware
#attributeをHTMLヘッダに格納する
Djangoアプリへのログインに用いるID情報は環境変数REMOTE_USERに格納するとして、そのほかに提供される情報もアプリ側で使いたい場合がある。この場合、HTTP Header情報に入れ込んでしまうのが手早い。
<Location />
AuthType shibboleth
ShibRequestSetting requireSession true
Require shibboleth
Require shib-session
ShibUseHeaders On # ← 追加
</Location>
注意:HTTP Header情報は、少し知識のある人なら改竄が可能。アクセス制御のようなFatalなところに使用するパラメタはここに入れないようにする。詳しくは、Shibboleth Wiki - AttributeAccessを参照。
また、取得したattributeを識別できるよう、接頭辞を指定する。
<ApplicationDefaults entityID="https://localhost/"
REMOTE_USER = "givenName"
cipherSuites="DEFAULT:!EXP:!LOW:!aNULL:!eNULL:!DES:!IDEA:!SEED:!RC4:!3DES:!kRSA:!SSLv2:!SSLv3:!TLSv1:!TLSv1.1"
attributePrefix="ATR_"> # ← 接頭辞を指定
すると、次のようなHTTP Headerが取得できる。
ATR_xusername: free_text_here
以上。