Personnummer

Skatteverket publicerar en skrift SKV 704 (upplaga 8 är senaste i skrivande stund) som beskriver hur personnummret är uppbyggt. I avsnittet "Personnummer i ADB-system" står följande:

Personnummer i ADB-system
Inom Skatteverkets ADB-system för folkbokföring
lagras personnumret med tolv siffror, där de två in-
ledande siffrorna anger under vilket århundrade en
person är född. Siffran för århundrade kan vara 18, 19
eller – efter millennieskiftet – 20.

Siffran visas normalt inte på terminalbilder eller
utskrifter men ingår i aviseringen av folkbokförings-
uppgifter till andra myndigheter via Navet, Skatte-
verkets system för distribution av folkbokföringsupp-
gifter till samhället.

SWAMID rekommenderar att man följer denna princip för personnummer som skickas via attributet norEduPersonNIN, d.v.s. att personnummer representeras som 12 tecken utan bindestreck eller mellanslag. För Shibboleth IdP finns norEduPersonNIN definerat på sidan Example of a standard attribute resolver for Shibboleth IdP v3.4.0 and above.

Samordningsnummer

Skatteverket publicerar en skrift SKV 707 (upplaga 2 är senaste i skrivande stund) som beskriver vad samordningsnummer är. I inledningen definieras skillnanden mellan samordningsnummer och personnummer enligt:

Samordningsnummer är en enhetlig identitetsbeteckning
för fysiska personer som inte är eller har
varit folkbokförda i Sverige. Skattekontoret kan tilldela
samordningsnummer på begäran av en myndighet.

Motsvarande identitetsbeteckning för den som är
eller har varit folkbokförd kallas personnummer.
Mer information om personnummer lämnas i Skatteverkets
informationsblad ”Personnummer” (SKV 704).

Universitet och högskolor får inte begära samordningsnummer från Skatteverket men om en person har ett samordningsnummer ska vi använda det. Det som särskiljer ett samordningsnummer från ett vanligt personnummer är att siffran för födelsedag ökas med talet 60, dvs. den som är född den tredje i månaden har 63 istället för 03.

Interimspersonnummer i Ladok och UHR antagningssystem

Ett interimspersonnummer i Ladok är konstruerat som ÅÅÅÅMMDDXnnn, d.v.s. med en versal bokstav i den 9:e positionen samt en könsvariabel i den 11:e positionen. Bokstaven behandlas som en etta vid uträkning av kontrollsiffran i position 12. Traditionellt har s.k. P-nummer används lokalt i Ladok men efter införandet av UHR antagningssystem har s.k. T-nummer används nationellt.

När samtliga tillgängliga interimspersonnummer har tagit slut för en bokstav fortsätter man med nästa i nedanstående ordning:

  1. T
  2. R
  3. S
  4. U
  5. W
  6. X
  7. J
  8. K
  9. L
  10. M
  11. N

Efter ’T’ ska ’R’ användas till dess samtliga tillgängliga interimspersonnummer med den bokstaven är slut för det aktuella datumet. Därefter används ’S’, osv.

Konfiguration för Shibboleth

Konfigurationerna under detta avsnitt fungerar endast för Shibboleth 3.4 eller senare. För simpleSAMLphp och ADFS kan konfigurationsexemplen endast användas som inspiration.

Hur gör man om man har personnumret i 12 tecken men inte i ett LDAP-attribut?

Förutsättning:


    <AttributeDefinition xsi:type="Simple" id="norEduPersonNIN">
        <InputDataConnector ref="myLDAP" attributeNames="mittPersonnummer"/>
        <AttributeEncoder xsi:type="SAML1String" name="urn:mace:dir:attribute-def:norEduPersonNIN" encodeType="false" />
        <AttributeEncoder xsi:type="SAML2String" name="urn:oid:1.3.6.1.4.1.2428.90.1.5" friendlyName="norEduPersonNIN" encodeType="false" />
    </AttributeDefinition>


Hur gör man om man har personnumret i 10 tecken och inte i LDAP-attributet norEduPersonNIN?

Förutsättningar:

<AttributeDefinition  xsi:type="ScriptedAttribute" id="norEduPersonNIN">
        <InputDataConnector ref="myLDAP" attributeNames="employeeNumber" />
        <Script>
        <![CDATA[
        // Script to handle 10 position wide national identity numbers
        // Create 12 position wide norEduPersonNIN from the attribute employeeNumber
        // Change employeeNumber to your NIN attribute name
                try {   
                        // Get a ref to the NIN received from ldap
                        // Change employeeNumber to your NIN attribute name
                        nin=employeeNumber.getValues().get(0);
                        // Only do decoration of NINs which are on the format YYMMDDxxxx
                        if(nin.length() == 10) {
                                // Create the two alternative return strings we have to choose between 
                                pnr19 = "19" + nin;
                                pnr20 = "20" + nin;
                                // Extract year/month/day from the NIN string
                                m_y = nin.substring(0,2);
                                m_m = nin.substring(2,4);
                                m_d = nin.substring(4,6);
                                // Create a Date object for the 20xx case
                                datePnr = new Date("20" + m_y, m_m-1, m_d);
                                // Create a Date object for the current date
                                dateCur = new Date(); 
                                // Verify the value of datePnr before proceeding
                                if(isNaN(datePnr.valueOf())) {
                                        throw("Failed to parse the NIN into a Date object");
                                }       
                                // If the 20xx case is in the future we assume 19xx for the NIN attribute
                                if(datePnr>dateCur) {
                                        norEduPersonNIN.getValues().add(pnr19);
                                } else {
                                        norEduPersonNIN.getValues().add(pnr20);
                                }       
                        } else if(nin.length() == 12) {
                                norEduPersonNIN.getValues().add(nin);
                        } else {
                                throw("Not setting any norEduPersonNIN since it is bogus (length=" + nin.length() + "): " + nin); 
                        }       
                }       
                catch(err) {
                        throw("Not setting any norEduPersonNIN due to exception: " + err); 
                }       
        ]]>     
        </Script>
</AttributeDefinition>

Skapa attributet personalIdentityNumber baserat på norEduPersonNin

Förutsättningar:

    <!-- Swedish eID Framework, personalIdentityNumber. Release norEduPersonNIN if it only contains numbers (filter out interim numbers) -->
    <!-- Uncomment InputAttributeDefinition if norEduPersonNIN is generated by a script or InputDataConnector if it is an attribute in LDAP -->
    <AttributeDefinition xsi:type="RegexSplit" id="personalIdentityNumber" regex="^((18|19|20)?[0-9]{2}((0[0-9])|(10|11|12))((([0-2][0-9])|(3[0-1]))|((6[1-9])|([7-8][0-9])|(9[0-1])))[0-9]{4})$">
        <!-- <InputAttributeDefinition ref="norEduPersonNIN"/> -->
        <!-- <InputDataConnector ref="myLDAP" attributeNames="norEduPersonNIN" /> -->
        <AttributeEncoder xsi:type="SAML1String" name="urn:mace:dir:attribute-def:personalIdentityNumber" encodeType="false" />
        <AttributeEncoder xsi:type="SAML2String" name="urn:oid:1.2.752.29.4.13" friendlyName="personalIdentityNumber" encodeType="false" />
    </AttributeDefinition>


Skapa attributet schacDateOfBirth baserat på norEduPersonNin

Förutsättningar:

    <!-- Schema: SCHema for ACademia (SCHAC) -->
    <!-- This takes the norEduPersonNIN and returns the date of birth part. -->
    <!-- Uncomment InputAttributeDefinition if norEduPersonNIN is generated by a script or InputDataConnector if it is an attribute in LDAP -->
    <AttributeDefinition xsi:type="RegexSplit" id="schacDateOfBirth" regex="^((18|19|20)?[0-9]{2}((0[0-9])|(10|11|12))((([0-2][0-9])|(3[0-1]))|((6[1-9])|([7-8][0-9])|(9[0-1])))).*$">
        <!-- <InputAttributeDefinition ref="norEduPersonNIN"/> -->
        <!-- <InputDataConnector ref="myLDAP" attributeNames="norEduPersonNIN" /> -->
        <AttributeEncoder xsi:type="SAML1String" name="urn:mace:dir:attribute-def:schacDateOfBirth" encodeType="false" />
        <AttributeEncoder xsi:type="SAML2String" name="urn:oid:1.3.6.1.4.1.25178.1.2.3" friendlyName="schacDateOfBirth" encodeType="false" />
    </AttributeDefinition>