Skip to content Skip to site navigation

Identifiers

Types of Identifiers

An identifier is any token that can act as a unique reference to an object in the Registry, in this case a Person. Principal among the Person identifiers are those that the University considers shared enterprise identifiers — SUNet IDs, University IDs, and Campus Card IDs — as well as identifiers mapping between identifiers from different sources. Identifiers are for the person as a whole; the Person Registry does not have "affiliated" identifiers (identifiers tied to specific affiliations in the record).

The Person Registry supports the following types of identifiers:

Identifier type Occ Source Description
min:max reg ext user
regid 1:1 yes no no Registry assigned UUID
directory 1:1 yes no no Unique "handle" for directory queries
univid 0:1 yes yes no 8-character numeric University ID
principal 0:1 no no yes Primary sunetid (aka network login ID, aka kerberos principal)
sunetid 0:n no yes yes All sunetids, primary and aliases
card 0:1 no yes no Campus Card mag-stripe number
proximity 0:1 no yes no Campus "proximity" card number
refid 0:n yes no no Full qualified reference to external source
other 0:n yes yes no Temporary identifier to indicate a requested, but not activated sunetid
xregid 0:n yes no no Previous regids for the person
xunivid 0:n yes no no Previous univids for the person
xprincipal 0:n yes no no Former personal login IDs
xrefid 0:n no no yes Previous, obsolete external references
  • Occ: min:max occurrences, where max="n" is no specified limit.
  • Source: reg(istry) = internally generated by Registry/Person rules; ext(ernal) = contributed by external source systems such as Campus PeopleSoft; user = person themselves during self-registration or via StanfordYou

A person in the registry always has two identifiers:

Registry ID

Registry Database: table=person, column=regid
XML Document: <Person regid="...">
LDAP Directory: suRegid
  suGeneralID

A 32-character representation of a registry-generated UUID (Universal Unique Identifier). Values are pre-generated and stored in the id_free_list table and assigned to new person entries via a trigger on the person row. The Person regid is exported as part of the person data and is a stable, enduring identifier for a person, even if other identifiers change over time. No other identifier both covers the complete Registry population and is intended by design to not change over time.

The format of a regid is equal to the hexadecimal string representation of a UUID, numbers 0..9, characters a..f, minus hyphens. Examples:

00e7e10692aa4aaf8a34ae62d7235b71
64ec5fa6e77011d1830c2436030baa77

Directory Unique ID

Registry Database: table=identifier, type_cd=directory
XML Document: <identifier type="directory">
LDAP Directory: suUniqueIdentifier
  suGeneralID

A registry assigned ID in the form Dxnnnannn, where each "nnn" is a random three digit number and the "a" is a random uppercase letter except for O or I (to avoid confusion with zero and one). The "Dx" prefix can technically be any pair of uppercase alphas over time. Originally only a prefix of DS was used (for Directory Services); more recently there have been cases of DR...DZ for operational reasons, but the current default assignment range stays with the DS series. The composite value is unique across the Person Registry.

Values are pre-generated and stored in the id_free_list table and assigned to new person entries via a trigger on the person row.

This identifier is specifically created to support a directory requirement, largely needed by the whois protocol, for a human readable and easily typed public number that can be offered on a multiple-entry menu and then used in a subsequent query where there is nothing else about an entry that would make a query unique to an individual. In essence it is a public "handle" for convenience in human and automated whois interactions for uniquely keying entries in a result set. It is not meant to be used as an enduring system identifier or retained as a permanent key for an individual as there is no guarantee that the numbers will remain the same over time.

All other identifiers are optional:

University ID

Registry Database: table=identifier, type_cd=univid
XML Document: <Person ... univid="...">
  <identifier type="univid">
LDAP Directory: suUnivid
  suGeneralID

An 8-character numeric ID used as a unique identifier for people across Stanford administrative applications. Univids are assigned in 2 ways:

  • Sourced from PeopleSoft CS: If the person does not yet have a univid one will be created from a CS refid. If the person already has a Registry-assigned univid, the Registry-assigned univid will be deprecated and become an xunivid, and the CS refid becomes the univid.
  • Sourced from PeopleSoft HR: If the person does not yet have a univid one will be created from a HR refid. If the person already has a Registry-assigned univid, the Registry-assigned univid will be deprecated and become an xunivid, and the HR refid becomes the univid.
  • Sourced from the Registry: When a sponsored affiliate becomes a member of the stanford:administrative privgroup, a univid is assigned from the next available value in the Registry's univid_freelist table.

Principal ID

Registry Database: table=identifier, type_cd=principal
XML Document: <identifier type="principal">
LDAP Directory: uid
  suGeneralID

The primary sunetid for the individual. It is a network-authenticatable secure ID corresponding to the user's Kerberos principal and also known as a network login ID. By policy a person may only have one principal identifier which is considered their identity identifier for infrastructure/network interactions. It also is the basis for all personal account services granted to an individual, that is, the principal ID is also the users email account, afs/leland account, etc.

This identifier exists for the person "for life", that is, regardless of whether the identifier is enabled for login or whether any services are attached.

SUNet ID

Database: table=identifier, type_cd=sunetid
XML Document: <identifier type="sunetid">
LDAP Directory: suSunetID
  suGeneralID

A person's Kerberos principal is also their primary SUNet ID, essentially a separate expression of this identifier as a service bearing ID for the person. Besides the primary sunetid, a person with full services can have up to two aliases that represent them in email addressing and homepage URL resolution. These are collectively known as the person's sunetids.

Sunetids exist in the Person entry only when they are active service IDs.

Campus Card ID

Registry Database: table=identifier, type_cd=card
XML Document: <identifier type="card">
LDAP Directory: suCardNumber
  suGeneralID

Also known as the mag-stripe number. This is the encoded key for the card and the number used by the ID Card system to associate cards with card holders in that system.

Campus "proximity" Card ID

Registry Database: table=identifier, type_cd=proximity
XML Document: <identifier type="proximity">
LDAP Directory: suProxyCardNumber

Campus cards that are enabled for door lock readers have an additional identifying number for that function, recorded as this identifier type. This connects IDs read by a card swipe with the card holder.

Reference ID

Registry Database: table=relationship, source_cd=source, reference_id=value
  table=identifier, type_cd=refid, identifier=source/value
XML Document: <identifier type="refid">
LDAP Directory: suGeneralID
 

Source systems each have their own identifiers within their systems to uniquely identity an individual. Such a local identifier must be passed to the Registry as part of any data feed. It is the ID the registry will use to reach back to the source system, if appropriate, to fetch data. It is also a reference to tie subsequent interactions with that source system to the same individual. A source system may be using an enterprise identifier or a local ID with meaning only to that system. In principle this is irrelevant and unknown to the Registry, which simply uses such IDs as opaque references back to the source system.

Reference IDs across all source systems are not by their nature globally unique. In the context of the registry, they are unique only as a combination of source code + identifier. In the relationship table these two parts are kept as separate attributes, while in the identifier table they are combined, separate by a slash, to create a unique identifier that doesn't collide with any enterprise identifier. For example:

refid = campcomm/09123716
refid = mla/29110362
refid = hospital/pers00583163erd_5224207312040500

Other

Registry Database: table=identifier, type_cd=other
XML Document: <identifier type="other">
LDAP Directory: suGeneralID

An undifferentiated type of ID contributed by a source to augment the search space. This generally has limited use and is used to solve specific problems. For instance, the sunetid system will insert a source=sunetid, type=other ID for a pending ID -- one that has been requested but not activated -- so that person can be found by that ID during sponsorship.

General

Registry Database: table=identifier, type_cd=general
XML Document: <identifier type="general">
LDAP Directory: suGeneralID

Originally a catchall for undifferentiated IDs, it served the purpose of "other" above as well as a general bucket for previous ID values of specific types, like a former univid or sunetid. This latter function has mostly moved to specific ID types (see next section). This ID type should be eliminated.

xregid, xunivid, xprincipal, xrefid

Registry Database: table=identifier, type_cd=xregid | xunivid | xprincipal | xrefid
XML Document: <identifier type="xregid | xunivid | xprincipal | xrefid">
LDAP Directory: suGeneralID

Former ("ex-") values of the correspondingly named identifiers. These IDs are still needed in the unique ID search space to a person can be found by both current and former enterprise identifiers, in case an external system still has an older reference.

Parts of an identifier

Each name in the registry is stored as a single row in the identifier of the Registry database. An identifier consists of these parts:

What Required? Schema xml
Type of identifier yes type_cd <identifier type="..."> attribute
Identifier yes identifier <identifier>#PCDATA
Normalized value yes normalized_identifier <identifier nval="..."> attribute

Type of identifier

Type of identifier per above.

Identifier

The identifier value itself in its "external" form, that is, case and punctuation preserved as assigned by a source or as entered by the user.

Normalized value

The identifier value forced to lower case and stripped of punctuation. This value is materialized in the database itself to support normalized searching for the Document Service and RegAdmin. As an exported value it facilitates use of the same normalized values for similar search requirements in the directory in the suGeneralID attribute.

Data integration rules

Identifiers from a source to the registry

The Person Registry has a domain of expected identifier types that it will process, as determined by the Person DTD. As discussed above, there are also specific rules around certain identifier types (e.g., campcomm refids and univids). Beyond this, the Person Registry accepts identifier values as provided by the source. Syntactic rules or the number of values allowed is the purview of those external systems.

Identifiers in the registry outbound Person XML document

All identifiers in the identifier table are exported in the document. Only the regid is not include in the <identifier> element since it is already a prominent identifier at the root of the document.

Events

Registry/Directory synchronization events

The Person Registry posts an registry_person:reconcile for any change in identifier data.

Infrastructure person events

The person Slog process that maintains Person data in the Directory posts the following events when directory attributes change. The parms designating the specific data type allow consumers to filter the events to select only changes needed by their system.

Directory attribute event (domain:topic) parm1
suCardNumber person:identifier card
uid person:identifier principal
suSUNetID person:identifier sunetid
suUnivid person:identifier univid
Last modified December 6, 2019