Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 5.3
Code Block
Kopierad till ny Wiki

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:

...

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

Info

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

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

Förutsättning:

  • Peronnummer Personnummer hämtas via attributet mittPersonnummer hämtas från källan myLDAP.
    Code Block
    <resolver:AttributeDefinition id="norEduPersonNIN" xsi:type="Simple"
            xmlns="urn:mace:shibboleth:2.0:resolver:ad" sourceAttributeID="mittPersonnummer">
      <resolver:Dependency ref="myLDAP" />
    
      <resolver:AttributeEncoder xsi:type="SAML1String"
                xmlns="urn:mace:shibboleth:2.0:attribute:encoder"
                name="urn:mace:dir:attribute-def:norEduPersonNIN" />
    
      <resolver:AttributeEncoder xsi:type="SAML2String"
                xmlns="urn:mace:shibboleth:2.0:attribute:encoder"
                name="urn:oid:1.3.6.1.4.1.2428.90.1.5" friendlyName="norEduPersonNIN" />
    </resolver:AttributeDefinition>
    

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

Förutsättningar:

  • Peronnummer hämtas via attributet mittPersonnummer hämtas från källan myLDAP, anpassa efter behov.
  • Personnumret kan vara både 10 och 12 siffror.
  • Använder "sliding windows" utan offset för att dynamiskt hantera 2000-problemet.
  • Loggningen i exemplet används av Stockholms universitet men behöver troligen anpassas utifrån det specifika lärosätets faktiska förutsättningar och behov.
Code Block
// Script to handle ten position wide national identity numbers
// Create 12 position wide norEduPersonNIN from the attribute mittPersonnummer
// Change mittPersonnummer to your NIN attribute name
// The script is supplied by SU
<resolver:AttributeDefinition id="norEduPersonNIN" xsi:type="Script"
        xmlns="urn:mace:shibboleth:2.0:resolver:ad" sourceAttributeID="mittPersonnummer">
  <resolver:Dependency ref="myLDAP" />

  <resolver:AttributeEncoder xsi:type="SAML1String"
            xmlns="urn:mace:shibboleth:2.0:attribute:encoder"
            name="urn:mace:dir:attribute-def:norEduPersonNIN" />

  <resolver:AttributeEncoder xsi:type="SAML2String"
            xmlns="urn:mace:shibboleth:2.0:attribute:encoder"
            name="urn:oid:1.3.6.1.4.1.2428.90.1.5" friendlyName="norEduPersonNIN" />

  <Script>
    <![CDATA[
      // Script to handle ten position wide national identity numbers
      // The script is supplied by SU

      // import needed packages
      importPackage(Packages.edu.internet2.middleware.shibboleth.common.attribute.provider);
      importPackage(Packages.org.slf4j);

      // Setup a logger
      logger = LoggerFactory.getLogger("se.su.it.shibboleth.idp.ninDecorator");

      //try the{
 attribute which is to be populated
  // Get a ref norEduPersonNINto =the new BasicAttribute("norEduPersonNIN");

      try {NIN received from ldap
        // GetChange amittPersonnummer ref to theyour SSNNIN receivedattribute from ldapname
        ssnnin=socialSecurityNumbermittPersonnummer.getValues().get(0);
        logger.debug("Doing decoration of ssnNIN " + ssn nin);

        // the attribute which is to be populated
        norEduPersonNIN = new BasicAttribute("norEduPersonNIN");


        // Only do decoration of SSNsNINs which are on the format YYMMDDxxxx      
        if(ssnnin.length() == 10) {
          // Create the two alternative return strings we have to choose between
          pnr19 = "19" + ssnnin;
          pnr20 = "20" + ssnnin;

          // Extract year/month/day from the SSNNIN string
          m_y = ssnnin.substring(0,2);
          m_m = ssnnin.substring(2,4);
          m_d = ssnnin.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();

          // Some debug logging
          logger.debug("pnr19: " + pnr19);
          logger.debug("pnr20: " + pnr20);
          logger.debug("datePnr: " + datePnr);
          logger.debug("dateCur: " + dateCur);

          // Verify the value of datePnr before proceeding
          if(isNaN(datePnr.valueOf())) {
            throw("Failed to parse the SSNNIN into a Date object");
          }

          // If the 20xx case is in the future we assume 19xx for the NIN attribute
          if(datePnr>dateCur) {
            logger.info("Returning 19xx pnr since the 20xx case is in the future");
            norEduPersonNIN.getValues().add(pnr19);
          } else {
            logger.info("Returning 20xx pnr since it is closer to current date than the 19xx one.");
            norEduPersonNIN.getValues().add(pnr20);
          }
        } else if(ssnnin.length() == 12) {
          logger.info("Returning pnr as-is since it contains 12 chars");
          norEduPersonNIN.getValues().add(ssnnin);
        } else {
          throw("Not setting any norEduPersonNIN since it is bogus (length=" + ssnnin.length() + "): " + ssnnin);
        }
      }
      catch(err) {
        logger.error("Not setting any norEduPersonNIN due to exception: " + err);
      }
    ]]>
  </Script> 
</resolver:AttributeDefinition>