uApprove.jp (uApproveを機能拡張しました)は、 エンドユーザに利用するサービスに送信する属性の表示の選択を提供するアプリケーションです。
本ガイドでは Shibboleth Identity Provider (IdP)のための
uApprove.jp のインストールおよび設定方法を説明します。
IdP プラグインおよび uApprove.jp viewer のインストール方法と、
ストレージとしてファイルもしくは SQL データベースを用いた設定方法を示します。
idp.example.org
/opt/uApprove
/opt/uApprove/conf
/opt/shibboleth-identityprovider-2.x
install.sh
が存在するディレクトリ)
/opt/shibboleth-idp
${CATALINA_HOME}
/usr/java/tomcat
)
wget https://www.gakunin.jp/docs/files/uApprove.jp-2.2.1b-bin.zip unzip uApprove.jp-2.2.1b-bin.zip -d /opt/ ln -s /opt/uApprove.jp-2.2.1b /opt/uApprove
cd /opt/uApprove mkdir conf logs war unzip idp-plugin-2.2.1b-bin.zip cp idp-plugin-2.2.1b/conf-template/* conf/ cp idp-plugin-2.2.1b/lib/* /opt/shibboleth-identityprovider-2.x/lib/
cd /opt/uApprove unzip viewer-2.2.1b-bin.zip cp viewer-2.2.1b/conf-template/* conf/
uApprove.jp は二つのソフトウェアから成り立っています。 IdP コンテクストの中で動作する IdP プラグインと
IdP コンテクストから独立した uApprove.jp viewer アプリケーションです。
どちらも共通のデータストレージとその操作のためのライブラリを使用します。
#storageType=database #databaseConfig=/opt/uApprove/conf/database.properties storageType=file flatFile = /opt/uApprove/data/uApprove-log.xml
mysql -u root -p mysql> CREATE DATABASE uApprove; CREATE USER 'uApprove'@'localhost' IDENTIFIED BY 'uApprove'; GRANT USAGE ON *.* TO 'uApprove'@'localhost'; GRANT SELECT , INSERT , UPDATE , DELETE ON `uApprove`.* TO 'uApprove'@'localhost'; ALTER DATABASE uApprove DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;次に、テーブルを作成します:
mysql -u root -p mysql> use uApprove; create table ArpUser ( idxArpUser int unsigned auto_increment primary key, auUserName varchar(255) not null, auLastTermsVersion varchar(255), auFirstAccess timestamp, auLastAccess timestamp ); create index idxUserName on ArpUser (auUserName ); create table ShibProvider ( idxShibProvider int unsigned auto_increment primary key, spProviderName varchar(255) ); insert into ShibProvider (idxShibProvider) values (1); create index idxProvidername on ShibProvider (spProviderName); create table AttrReleaseApproval ( idxAttrReleaseApproval int unsigned auto_increment primary key, araIdxArpUser int unsigned references ArpUser ( idxArpUser ), araIdxShibProvider int unsigned references ShibProvider( idxShibProvider ), araTimeStamp timestamp not null, araTermsVersion varchar(255), araAttributes text(2048) ); create table ProviderAccess ( idxProviderAccess int unsigned auto_increment primary key, paIdxArpUser int unsigned references ArpUser( idxArpUser ), paIdxShibProvider int unsigned references ShibProvider( idxShibProvider ), paAttributesSent text, paTermsVersion varchar(255), paIdxAttrReleaseApproval int unsigned references AttrReleaseApproval ( idxAttrReleaseApproval ), paShibHandle varchar(255), paTimeStamp timestamp not null ); create table CheckAlways ( idxCheckAlways int unsigned auto_increment primary key, caIdxArpUser int unsigned references ArpUser ( idxArpUser ), caIdxShibProvider int unsigned references ShibProvider ( idxShibProvider ), caTimeStamp timestamp not null );
簡単にデータベースの設定が正しいかを確認するためには、下記コマンドを利用できます:
echo 'SHOW TABLES' | mysql -u uApprove -p -h localhost uApprove Enter password: Tables_in_uApprove ArpUser AttrReleaseApproval CheckAlways ProviderAccess ShibProvider
データベースを利用する設定は /opt/uApprove/conf/common.properties で行います:
storageType=database databaseConfig=/opt/uApprove/conf/database.properties #storageType=file #flatFile=/opt/uApprove/data/uApprove-log.xml
データベース固有の設定すべては /opt/uApprove/conf/database.properties で行います:
sqlCommands=/opt/uApprove/conf/mysql.commands # first option to use jndi and container managed connections # resourceName=jdbc/mypool # second option to use application managed connection pooling # this is provided by the bonecp library http://jolbox.com/ # these are the required parameters driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/uApprove user=uApprove password=uApprove # optional parameters for bonecp # # connectionTestStatement=SELECT 1 # minConnectionsPerPartition=1 # maxConnectionsPerPartition=5 # partitionCount=2
termsOfUse=/opt/uApprove/conf/terms-of-use.xml
IdP プラグインおよび viewer アプリケーションは機密情報を交換するため、 /opt/uApprove/conf/common.properties で定義される共通秘密鍵(128bit, 16バイト)により暗号化と復号を行います。
sharedSecret=QErDXYZEAoS6jooPvdBhQg==簡単に 16 文字の乱数を生成するためには、以下コマンドを利用できます:
openssl rand -base64 16 2>/dev/null
IdP プラグインは Shibboleth IdP web アプリケーション /opt/shibboleth-identityprovider-2.x/src/main/webapp/WEB-INF/web.xml で有効にする必要があります:
<web-app> ... <filter> <filter-name>uApprove.jp IdP plugin</filter-name> <filter-class>ch.SWITCH.aai.uApprove.idpplugin.Plugin</filter-class> <init-param> <param-name>Config</param-name> <param-value> /opt/uApprove/conf/idp-plugin.properties; /opt/uApprove/conf/common.properties; </param-value> </init-param> </filter> <filter-mapping> <filter-name>uApprove.jp IdP plugin</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping> </web-app>
Shibboleth IdP を再デプロイします:
cd /opt/shibboleth-identityprovider-2.x/ sh install.sh Buildfile: src/installer/resources/build.xml install: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Be sure you have read the installation/upgrade instructions on the Shibboleth website before proceeding. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Where should the Shibboleth Identity Provider software be installed? [/opt/shibboleth-idp] The directory '/opt//opt/shibboleth-idp' already exists. Would you like to overwrite this Shibboleth configuration? (yes, [no]) no Updating property file: /opt/shibboleth-identityprovider-2.x/src/installer/resources/install.properties Copying 61 files to /opt/shibboleth-idp/lib Copying 5 files to /opt/shibboleth-idp/lib/endorsed Copying 1 file to /opt/shibboleth-identityprovider-2.x/src/installer Building war: /opt/shibboleth-identityprovider-2.x/src/installer/idp.war Copying 1 file to /opt/shibboleth-idp/war Deleting: /opt/shibboleth-identityprovider-2.x/src/installer/web.xml Deleting: /opt/shibboleth-identityprovider-2.x/src/installer/idp.war BUILD SUCCESSFUL Total time: 17 seconds
idp.war
ファイルを${CATALINA_HOME}/webapps
にコピーします:
cp /opt/shibboleth-idp/war/idp.war ${CATALINA_HOME}/webapps/
SP ブラックリストはユーザの同意対象から除外するリソースを定義します。
SP ブラックリストはオプションで設定は /opt/uApprove/conf/idp-plugin.properties で行います:
spBlacklist=/opt/uApprove/conf/sp-blacklist
sp-blacklist
中の各行ではブラックリスト対象のリソースを表す正規表現の定義を行います:
# 例 1: 特定のリソース https://sp\.example\.org/shibboleth # 例 2: SP に存在するすべてのアプリケーション https://sp\.example\.org/.* # 例 3: 特定ドメインにあるすべての SP https://.*\.example\.org/.*
属性リストの順序を定義できます。さらに、必要ならば属性の隠蔽もできます。属性リストの設定はオプションで、 /opt/uApprove/conf/idp-plugin.properties で行います:
attributeList=/opt/uApprove/conf/attribute-list
attribute-list
は下記のようになります:
# 属性の順序を定義 surname givenName postalAddress ... # 隠す属性 !persistentId !transientId
データベースを使用する場合は各プロバイダのアクセスに対して記録を残すことが可能で、
これはすべての属性の送信がデータベースに保存されていることを意味します。
IdP プラグイン は monitoring only mode で実行することも可能で、
これはすべてのプロバイダのアクセスを記録しますが、ユーザの同意のためのやりとりは行いません。
viewer web アプリケーションを使用する場合、
IdP プラグインは viewer web アプリケーションのデプロイ先を知っている必要があります。
IdP プラグインに、isPassiveリクエストに関して考慮の必要があることを伝えることができます。
設定は /opt/uApprove/conf/idp-plugin.properties で行います:
logProviderAccess=false monitoringOnly=false uApproveViewer=https://idp.example.org/uApprove/Controller isPassiveSupport=false
uApprove.jp webapp のための tomcat のデプロイの記述を ${CATALINA_HOME}/conf/Catalina/localhost/uApprove.xml で定義します:
<Context docBase="/opt/uApprove/war/uApprove.war" privileged="true" antiResourceLocking="false" antiJARLocking="false" unpackWAR="false" />
設定ディレクトリに従って、viewer アプリケーション の設定を修正します。 変更は/opt/uApprove/viewer-2.2.1b/webapp/WEB-INF/web.xml で行います:
<web-app> ... <context-param> <param-name>Config</param-name> <param-value> /opt/uApprove/conf/viewer.properties; /opt/uApprove/conf/common.properties; </param-value> </context-param> ... <web-app>
必要であれば、ロゴやナビゲーションメニューを変更します。
ロゴは/opt/uApprove/viewer-2.2.1b/webapp/images以下のイメージファイルやURLを
使うことができます。
設定は/opt/uApprove/viewer-2.2.1b/webapp/header.jspで行います:
<body class="switchaai"> <div class="box-aai" style="width: 650px;"> <img src="images/GakuNin_logo.png" alt="GakuNin-logo" class="switchaai" height="32" width="162"> <br> <span class="switchaai"><a href="http://www.gakunin.jp/" class="switchaai">About GakuNin</a></span>uApprove webapp をデプロイします:
cd /opt/uApprove/viewer-2.2.1b/ ant deploy -Duapprove.deployment=/opt/uApprove/war
viewer web アプリケーションは属性名や説明といった静的なテキストと動的なテキストに対して多言語対応です。
静的なテキストは次の言語が対応しています: 英語(en), ドイツ語(de), フランス語(fr), イタリア語(it), ポルトガル語(pt), 日本語(ja)
ローカライズされた属性名と説明は /opt/shibboleth-idp/conf/attribute-resolver.xml
(Shibboleth IdP resolver) から取得します。ローカライズされた属性名や説明は変更や追加ができます:
... <resolver:AttributeDefinition id="postalAddress" xsi:type="Simple" xmlns="urn:mace:shibboleth:2.0:resolver:ad" sourceAttributeID="postalAddress"> <resolver:Dependency ref="myLDAP" /> <resolver:DisplayName xml:lang="en">Business postal address</resolver:DisplayName> <resolver:DisplayName xml:lang="de">Geschäftsadresse</resolver:DisplayName> <resolver:DisplayName xml:lang="fr">Adresse Professionnelle</resolver:DisplayName> <resolver:DisplayName xml:lang="it">Indirizzo professionale</resolver:DisplayName> <resolver:DisplayName xml:lang="ja">所属組織住所</resolver:DisplayName> <resolver:DisplayDescription xml:lang="en">Business postal address: Campus or office address</resolver:DisplayDescription> <resolver:DisplayDescription xml:lang="de">Adresse am Arbeitsplatz</resolver:DisplayDescription> <resolver:DisplayDescription xml:lang="fr">Adresse de l'institut, de l'universite</resolver:DisplayDescription> <resolver:DisplayDescription xml:lang="it">Indirizzo professionale: Indirizzo dell'istituto o dell'ufficio</resolver:DisplayDescription> <resolver:DisplayDescription xml:lang="ja">所属組織(大学、会社など)の住所</resolver:DisplayDescription> <resolver:AttributeEncoder xsi:type="SAML1String" xmlns="urn:mace:shibboleth:2.0:attribute:encoder" name="urn:mace:dir:attribute-def:postalAddress" /> <resolver:AttributeEncoder xsi:type="SAML2String" xmlns="urn:mace:shibboleth:2.0:attribute:encoder" name="urn:oid:2.5.4.16" friendlyName="postalAddress" /> </resolver:AttributeDefinition> ...
viewer はユーザのブラウザが要求する言語で表示します。その言語が利用できない場合はデフォルトのロケールである en を使用します。
特定の言語を強制することもできます。設定は /opt/uApprove/conf/viewer.properties で行います:
useLocale=en_US
globalConsentPossible=true
loggingConfig=/opt/uApprove/conf/logging.xmlログファイルは
logging.xml
で設定します。 Tomcat から書き込みできることを確認してください:
<configuration> ... <appender class="ch.qos.logback.core.FileAppender" name="RootFileAppender"> <file>/opt/uApprove/logs/uApprove.log</file> ... </appender> ... </configuration>
<VirtualHost idp.example.org:443> ... <Location /uApprove> Allow from all ProxyPass ajp://localhost:8009/uApprove </Location> ... </VirtualHost>Apache HTTPd を再起動してください:
/etc/init.d/apache2 restart
プロファイルハンドラファイル(例えば、/opt/shibboleth-idp/conf/handler.xml)内に このプラグインのためにネームスペース宣言を追加する必要があります。以下のように行います:
<ProfileHandlerGroup>
ルート要素のxmlns:xsi
属性の前に
xmlns:uajpph="http://www.gakunin.jp/ns/uapprove-jp/profile-handler"
属性を追加xsi:schemaLocation
属性の値のリストの最後に下記を追加http://www.gakunin.jp/ns/uapprove-jp/profile-handler classpath:/schema/shibboleth-2.0-idp-profile-handler-uapprovejp.xsd
... <ph:ProfileHandlerGroup xmlns:ph="urn:mace:shibboleth:2.0:idp:profile-handler" xmlns:uajpph="http://www.gakunin.jp/ns/uapprove-jp/profile-handler" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:mace:shibboleth:2.0:idp:profile-handler classpath:/schema/shibboleth-2.0-idp-profile-handler.xsd http://www.gakunin.jp/ns/uapprove-jp/profile-handler classpath:/schema/shibboleth-2.0-idp-profile-handler-uapprovejp.xsd"> ...
xsi:type
属性の値を ph:SAML1AttributeQuery
から uajpph:SAML1AttributeQueryUApprove
に変更xsi:type
属性の値を ph:SAML2AttributeQuery
から uajpph:SAML2AttributeQueryUApprove
に変更... <ph:ProfileHandler xsi:type="uajpph:SAML1AttributeQueryUApprove" inboundBinding="urn:oasis:names:tc:SAML:1.0:bindings:SOAP-binding" outboundBindingEnumeration="urn:oasis:names:tc:SAML:1.0:bindings:SOAP-binding"> <ph:RequestPath>/SAML1/SOAP/AttributeQuery</ph:RequestPath> </ph:ProfileHandler> ... <ph:ProfileHandler xsi:type="uajpph:SAML2AttributeQueryUApprove" inboundBinding="urn:oasis:names:tc:SAML:2.0:bindings:SOAP" outboundBindingEnumeration="urn:oasis:names:tc:SAML:2.0:bindings:SOAP"> <ph:RequestPath>/SAML2/SOAP/AttributeQuery</ph:RequestPath> </ph:ProfileHandler> ...
uApprove.jpはSPのメタデータ内の <RequestedAttribute>
要素
(Shibboleth Service Providerの設定を参照ください)と
IdP の属性フィルターポリシーファイル内の<AttributeFilterPolicy>
要素を
理解することで、属性が必須であるかオプショナルであるかを決定します。
属性フィルターポリシーファイル(例えば、/opt/shibboleth-idp/conf/attribute-filter.xml)内に このプラグインのためにネームスペース宣言を追加する必要があります。以下のように行います:
<AttributeFilterPolicyGroup>
ルート要素のxmlns:xsi
属性の前に
xmlns:uajpmf="http://www.gakunin.jp/ns/uapprove-jp/afp/mf"
属性を追加xsi:schemaLocation
属性の値のリストの最後に下記を追加http://www.gakunin.jp/ns/uapprove-jp/afp/mf classpath:/schema/shibboleth-2.0-afp-mf-uapprovejp.xsd
... <afp:AttributeFilterPolicyGroup id="ShibbolethFilterPolicy" xmlns:afp="urn:mace:shibboleth:2.0:afp" xmlns:basic="urn:mace:shibboleth:2.0:afp:mf:basic" xmlns:saml="urn:mace:shibboleth:2.0:afp:mf:saml" xmlns:uajpmf="http://www.gakunin.jp/ns/uapprove-jp/afp/mf" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:mace:shibboleth:2.0:afp classpath:/schema/shibboleth-2.0-afp.xsd urn:mace:shibboleth:2.0:afp:mf:basic classpath:/schema/shibboleth-2.0-afp-mf-basic.xsd urn:mace:shibboleth:2.0:afp:mf:saml classpath:/schema/shibboleth-2.0-afp-mf-saml.xsd http://www.gakunin.jp/ns/uapprove-jp/afp/mf classpath:/schema/shibboleth-2.0-afp-mf-uapprovejp.xsd">
uApprove.jpはPolicy RequirementルールとAttribute RulesのPermit/Deny Valueルールを拡張します:
<afp:PolicyRequirementRule xsi:type="uajpmf:AttributeUapprove">
要素によって定義されます。
そして、SPのメタデータ内に<AttributesConsumingService>
要素が存在する場合に適用されます。
<afp:PermitValueRule xsi:type="uajpmf:AttributeUapprove"/>
要素と
<afp:DenyValueRule xsi:type="uajpmf:AttributeUapprove"/>
要素両方によって定義されます。
<AttributeConsumingService>
要素内の
<RequestedAtrribute>
要素の isRequired
属性が true の場合は、
この属性は必須属性となり、常にSPに送信されます。
xsi:type="uajpmf:AttributeUapprove"
を持たない許可された属性は必須属性として扱われます。
uajpmf:AttributeUapprove Matchファンクションを用いたPermit Valueルールの例を示します:
<!-- ================================================================================== case 1: メタデータ内に AttributesConsumingService 要素を持つSPにマッチします。 eduPersonPrincipalName 属性はオプショナル属性で、ユーザは送信するか否かを選択できます。 eduPersonAffiliation 属性は必須属性で、常に送信されます。 ================================================================================== --> <afp:AttributeFilterPolicy id="PolicyforSPwithAttributesConsumingService"> <afp:PolicyRequirementRule xsi:type="uajpmf:AttributeUapprove" /> <afp:AttributeRule attributeID="eduPersonPrincipalName"> <afp:PermitValueRule xsi:type="uajpmf:AttributeUapprove" /> </afp:AttributeRule> <afp:AttributeRule attributeID="eduPersonAffiliation"> <afp:PermitValueRule xsi:type="basic:ANY" /> </afp:AttributeRule> ... </afp:AttributeFilterPolicy> <!-- ================================================================================== case 2: メタデータ内に AttributesConsumingService 要素を持たないSPにマッチします。 eduPersonPrincipalName 属性 および eduPersonAffiliation 属性共に必須属性です。 ================================================================================== --> <afp:AttributeFilterPolicy id="PolicyforSPwithoutAttributesConsumingService"> <afp:PolicyRequirementRule xsi:type="basic:NOT"> <basic:Rule xsi:type="uajpmf:AttributeUapprove"/> </afp:PolicyRequirementRule> <afp:AttributeRule attributeID="eduPersonPrincipalName"> <afp:PermitValueRule xsi:type="basic:ANY" /> </afp:AttributeRule> <afp:AttributeRule attributeID="eduPersonAffiliation"> <afp:PermitValueRule xsi:type="basic:ANY" /> </afp:AttributeRule> ... </afp:AttributeFilterPolicy> <!-- ================================================================================== case 3: 全てのSPにマッチします。 eduPersonPrincipalName 属性 および eduPersonAffiliation 属性はオプショナル属性です。 ================================================================================== --> <afp:AttributeFilterPolicy id="PolicyforAnyone"> <afp:PolicyRequirementRule xsi:type="basic:ANY" /> <afp:AttributeRule attributeID="eduPersonPrincipalName"> <afp:PermitValueRule xsi:type="uajpmf:AttributeUapprove" /> </afp:AttributeRule> <afp:AttributeRule attributeID="eduPersonAffiliation"> <afp:PermitValueRule xsi:type="uajpmf:AttributeUapprove" /> </afp:AttributeRule> ... </afp:AttributeFilterPolicy>
... <form ...> <table> ... <tr> <td colspan="2"> <input type="checkbox" name="resetuserconsent" value="true" /> Reset my attribute release approvals </td> </tr> </table> </form> ...
REMOTE_USER
を提供する
Shibboleth Service Provider のどちらかで JSP が保護されている必要があります。
standalone JSP は下記のように呼ばれます。この際パラメータ standalone-next-url
が設定される必要があります。
https://idp.example.org/uApprove/reset-approvals.jsp?standalone-next-url=http://go.here.org/after/reset
${CATALINA_HOME}/bin/shutdown.sh && sleep 10 && ${CATALINA_HOME}/bin/startup.sh
... <logger name="ch.SWITCH.aai" level="DEBUG"> <appender-ref ref="IDP_PROCESS"/> </logger> <logger name="jp.gakunin.shibboleth" level="DEBUG"> <appender-ref ref="IDP_PROCESS"/> </logger> ...uApprove.jp viewer のログは 1.4.3 で説明したように設定します。log level を
DEBUG
に変更します。
<servlet> ... <init-param> <param-name>compilerSourceVM</param-name> <param-value>1.5</param-value> </init-param> <init-param> <param-name>compilerTargetVM</param-name> <param-value>1.5</param-value> </init-param> ... </servlet>
SPは <SPSSODescriptor>
要素内の <AttributeConsumingService>
要素内の
<RequestedAttribute>
要素を用いて SP が必須とする、もしくは希望する属性を定義できます。
<RequestedAttribute>
要素は下記の属性を持ちます:
<RequestedAttribute>
要素に以下の属性を記述して、属性の説明文を定義できます。定義した説明文は、uApprove.jp の viewer アプリケーションによって表示されます。
<RequestedAttributeExtension>
要素を用いると、複数の言語で説明文を定義することができます。
<RequestedAttributeExtension>
要素の定義は uajpmd:descrption
属性の定義に優先します。
<RequestedAttributeExtension>
要素は <SPSSODescriptor>
要素の子要素 <Extensions>
に記述します。
<RequestedAttributeExtension>
要素には以下の属性が必要です。
<RequestedAttribute>
要素のFriendlyName
属性の値と同じ値を記述します。
説明文は <Description>
要素に記述します。<RequestedAttributeExtension>
要素は一つ以上の <Description>
要素をもつことができます。
<Description>
要素には以下の属性が必要です。
<AttributeConsumingService>
要素の例を下記に示します:
<md:EntitiesDescriptor Name="uapprovejp-dev-metadata.xml" xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:shibmd="urn:mace:shibboleth:metadata:1.0" xmlns:uajpmd="http://www.gakunin.jp/ns/uapprove-jp/metadata" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> ... <md:EntityDescriptor entityID="..."> <md:SPSSODescriptor> ... <md:Extensions> ... <RequestedAttributeExtension xmlns="http://www.gakunin.jp/ns/uapprove-jp/metadata" FriendlyName="displayName"> <Description xml:lang="en">Our SP uses the displayName attribute in order to display your name to our web page</Description> <Description xml:lang="ja">SPはウェブページに名前を表示するためにdisplayName属性を使用します</Description> </RequestedAttributeExtension> ... </md:Extensions> ... <md:AttributeConsumingService index="1"> <md:ServiceName xml:lang="en">Sample Service</md:ServiceName> <md:ServiceDescription xml:lang="en"> An example service that requires a human-readable identifier and optional name and e-mail address. </md:ServiceDescription> <md:RequestedAttribute FriendlyName="eduPersonPrincipalName" Name="urn:oid:1.3.6.1.4.1.5923.1.1.1.6" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" isRequired="true"/> <md:RequestedAttribute FriendlyName="mail" Name="urn:oid:0.9.2342.19200300.100.1.3" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" uajpmd:description="Our SP uses the mail attribute in order to fill the registration form with your mail address."/> <md:RequestedAttribute FriendlyName="displayName" Name="urn:oid:2.16.840.1.113730.3.1.241" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/> </md:AttributeConsumingService> ... </md:SPSSODescriptor>