Zur Kommunikation studentischer Matrikelnummern an Stellen der öffentlichen Verwaltung oder Systeme der Lehrverwaltung, die dieses Datum legitimerweise benötigen.

Geltungs- und Nutzungsbereich

Anwendungen, die studienrelevante Daten verwalten, brauchen u.U. zur eindeutigen Identifikation von Studierenden auch die österreichweit eindeutige Matrikelnummer. Sofern keine technische Verbindung zu Systemen der öffentlichen bzw. Hochschullehrverwaltung besteht, sollte jedenfalls auf die Nutzung der Matrikelnummer als name identifier verzichtet werden – ebenso wie z.B. die Sozialversicherungsnummer nur innerhalb des für sie bestimmten Bereichs der Gesundheitsverwaltung eingesetzt werden sollte.

Matrikelnummern sind keine guten Identifier für Personen (auch etwa als Teil von UserIDs oder Email-Adressen) oder anderen Gebrauch außerhalb der Lehrverwaltung im engeren Sinn, da es durch (Korrektur von) Falsch- bzw. Neuvergaben immer wieder zu Änderungen von Matrikelnummern kommt, auch wenn diese eigentlich lebenslang unverändert und landesweit eindeutig sein sollten.

Solche Änderung an Verwaltungsdaten sollten nach Möglichkeit auf Systeme der Lehrverwaltung beschränkt bleiben. Benutzt man die Matrikelnummer jedoch auch als Basis von UserIDs oder Email-Adressen, vervielfältigt man die Auswirkungen solcher Änderungen in andere IT-Systeme, unter teils hohem Aufwand für Datenmigration und BenutzerInnen-Support ("Ihre UserID, Email-Adresse, Homepage, eduroam-Identifier, etc. haben sich geändert, ..."). Im Kontext von Identity Federation wären dann aber auch Systeme außerhalb der eigenen Institution von solchen Änderungen betroffen, wenn etwa das eduPersonPrincipalName-Attribut aus der Matrikelnummer gebildet würde und diese sich änderte: Damit änderte sich auch der Wert des eduPersonPrincipalName und Betroffene verlören damit u.U. Zugriff auf ihre Daten bei diversen föderierten Services, die sich eben auf das eduPersonPrincipalName-Attribut zur Wiedererkennung ihrer NutzerInnen verließen. Im Anlassfall "alle" davon betroffenen Services zu ermitteln und zu verständigen und um deren Kooperation bei der Korrektur/dem Nachtragen solcher Änderungen zu ersuchen, erscheint wenig verlockend.

SCHAC personalUniqueCode

Im international eingesetzten SCHAC-Schema wurde das Attribut schacPersonalUniqueCode definiert, das auch für die Formulierung des European Student Identifier (ESI) verwendet wird: Die Werte dieses Attributs sind URNs mit standardisierten Prefixen. Sofern also die studentische Matrikelnummer als SAML-Attribut übertragen werden soll, empfielt ACOnet die Form als ESI:

urn:schac:personalUniqueCode:int:esi:at:01234567

Shibboleth IDP

Erzeugen

Nachdem dieses Attribut nicht in genau in Form des ESI bereits irgendwo gespeichert sein wird, folgt ein Beispiel, wie dynamisch aus dem Attribut uid (das aus dem DataConnector mit der id="myLDAP" kommt) die Matrikelnummer extrahiert und in die benötigte Form gebracht werden kann. In diesem (fiktiven) Beispiel enthält uid eine lokale UserID, die für Studierende dem Werteschema "x<MATRIKELNR>" folgt. Hat die UserID nicht die erwartete Form, bleibt das Attribut leer (und wird vom IDP später entfernt):

<AttributeDefinition id="schacPersonalUniqueCode" xsi:type="Mapped">
    <InputDataConnector ref="myLDAP" attributeNames="uid" />
    <DisplayName xml:lang="de">Europäische Studierendenkennung (ESI)</DisplayName>
    <DisplayName xml:lang="en">European Student Identifier (ESI)</DisplayName>
    <ValueMap>
        <ReturnValue>urn:schac:personalUniqueCode:int:esi:at:$1</ReturnValue>
        <SourceValue>^x([0-9]{8,})$</SourceValue>
    </ValueMap>
    <AttributeEncoder xsi:type="SAML2String" name="urn:oid:1.3.6.1.4.1.25178.1.2.14" friendlyName="schacPersonalUniqueCode" encodeType="false" />
</AttributeDefinition>


Statt uid kann hier also jedes existierende Attribut eingesetzt werden, das bereits eine konsistente Form der Matrikelnummer enthält (etwa E-Mail-Adresse (mail) oder eduPersonPrincipalName) um daraus die Matrikelnummer zu extrahieren und zu einem ESI zu formen.

Wird keine Umformung des Quelldatums benötigt (fiktives Attribut matrikelnummer liefert bereits genau diese), reicht auch eine Template-Definition:

<AttributeDefinition id="schacPersonalUniqueCode" xsi:type="Template">
    <InputDataConnector ref="myLDAP" attributeNames="matrikelnummer" />
    <DisplayName xml:lang="de">Europäische Studierendenkennung (ESI)</DisplayName>
    <DisplayName xml:lang="en">European Student Identifier (ESI)</DisplayName>
    <Template>urn:schac:personalUniqueCode:int:esi:at:${matrikelnummer}</Template>
    <AttributeEncoder xsi:type="SAML2String" name="urn:oid:1.3.6.1.4.1.25178.1.2.14" friendlyName="schacPersonalUniqueCode" encodeType="false" />
</AttributeDefinition>

Keine Matrikelnummer

Institutionen, die keine Matrikelnummern ausgeben, erzeugen den European Student Identifier übrigens weitgehend analog, nur eben aus einer lediglich lokal eindeutigen Kennung (im Beispiel unten wieder aus dem uid-Attribut) sowie der kanonischen DNS-Domain ("scope") der Institution:

<AttributeDefinition id="schacPersonalUniqueCode" xsi:type="Template">
    <InputDataConnector ref="myLDAP" attributeNames="uid" />
    <DisplayName xml:lang="de">Europäische Studierendenkennung (ESI)</DisplayName>
    <DisplayName xml:lang="en">European Student Identifier (ESI)</DisplayName>
    <Template>urn:schac:personalUniqueCode:int:esi:%{idp.scope}:${uid}</Template>
    <AttributeEncoder xsi:type="SAML2String" name="urn:oid:1.3.6.1.4.1.25178.1.2.14" friendlyName="schacPersonalUniqueCode" encodeType="false" />
</AttributeDefinition>

Freigeben

Eine passende Policy für den attribute-filter.xml, dieses Attribut (d.h. nur die ESI-spezifischen Werte des schacPersonalUniqueCode-Attributs) nur an aufgezählte Service Provider weiterzugeben (etwa an den eduID.at Demo SP und den Erasmus+ Proxy), und nur, wenn das Attribut eduPersonAffiliation den Wert student hat (also nur für Studierende), könnte beim Shibboleth IDP dann so aussehen:

<AttributeFilterPolicy id="ESItoSelectedServices">
    <PolicyRequirementRule xsi:type="AND">
        <Rule xsi:type="OR">
            <Rule xsi:type="Requester" value="https://test-sp.aco.net/shibboleth" />
            <Rule xsi:type="Requester" value="https://proxy.prod.erasmus.eduteams.org/metadata/backend.xml" />
        </Rule>
        <Rule xsi:type="Value" attributeID="eduPersonScopedAffiliation" value="student" />
    </PolicyRequirementRule>
    <AttributeRule attributeID="schacPersonalUniqueCode">
        <PermitValueRule xsi:type="ValueRegex" regex="^urn:schac:personalUniqueCode:int:esi:.*$" />
    </AttributeRule>
</AttributeFilterPolicy>