SSO Integration Guide for I-9 Complete v2.0
Introduction
About This Document
This document describes the authentication protocols and worflows available to integrate with Tracker I-9 Complete as well as detailing the technical aspects of the integration.
Key Concepts
Claims-Based Identification
Claims-based identity is a straightforward idea, founded on a small number of concepts: claims, tokens, identity providers, and a few more.
What is an identity? A digital identity is a set of information about somebody or something. It’s common to refer to a set of identity information as a security token or token. A token contains one or more claims, each of which carries some piece of information about the user it identifies.
Identity Provider
The software tool or service that performs the authentication, checking usernames and passwords, verifying account status, invoking two-factor, etc. Tokens are created by Identity Providers (IDPs).
Service Provider
A Service Provider (SP) is a system entity that receives and accepts an authentication tokens issued by an identity provider. A web application that provides a service to its users. Tracker I-9 Complete is the service provider.
Open Standard
There are several standards-based authentication protocols: OpenID Connect, SAML 2.0 and OAuth 2.0. Tracker uses OpenID Connect protocol. OpenID Connect is an open standard that organizations use to authenticate users. IDPs use this so that users can sign in to the IDP, and then access other websites and apps without having to log in or share their sign-in information.
Tracker Identity Provider
Tracker uses Azure Active Directory B2C as identity provider. Azure Active Directory B2C (Azure AD B2C) is an identity management service that enables custom control of how your customers sign up, sign in, and manage their profiles when using .NET applications. Azure AD B2C provides business-to-customer identity as a service. Customers can use their preferred Identity provider to get single sign-on access to Tracker.
Tracker Supported Authentication
Tracker currently supports the following authentication scenarios:
- OpenID SP Initiated SSO. Clients will use their own IDP
- OpenID IDP Initiated SSO. Clients will use their own IDP
Identity Provider (IDP) Initiated SSO
With Identity Provider Initiated SSO, the end users will sign into Tracker’s Identity Provider or Client designed Identity Provider login page and then the Identity Provider will send an authorization request to the service provider (Tracker). Here is a diagram of the user flow using a client’s identity provider:
Service Provider (SP) Initiated SSO
With service Provider Initiated SSO, the end users will navigate to service provider URL which initiates authorization request to the clients IDP and redirects the user to their IDP login page, after successful authentication user will be redirected back to service provider.
How to Implement SSO With I-9 Complete
Overview
SSO will only be used to grant application access for users with User Accounts:
- Users are sometimes known as HR Manager, I-9 Managers, Section 2 Signatories, Recruiters, or Hiring Managers.
- Client Admin users
- Employee users for remote UIs only (if enabled)
- Distributor Admin (Tracker partners only)
Before You Start
There are a couple of things you need before you can start:
-
Tracker will provide login Redirect URI required for client to create an application in their IDP. Note this URL is internal and not exposed to users. Clients will be sending claims to this URL. Please use:
https://your-tenant-name.b2clogin.com/your-tenant-name.onmicrosoft.com/oauth2/authresp - Replace your-tenant-name with Azure AD B2C tenant name.
-
Clients will provide credentials of the created application to Tracker
- Client ID
- Client Secret
-
Clients will provide the Metadata endpoint URI of the authorization server to Tracker.
-
Client will provide IDP organization Uri to Tracker
User URL
For SP initiated SSO users will use the following URL: https://i9complete.com/sso/C{clientId}.
For IDP initiated, Clients will need to configure the login URL in their IDP. Please use same URL https://i9complete.com/sso/C{clientId}; This is the URL where users will be redirected once they login to the IDP and click on configured tracker application.
Choose an Account Management Type
You have three account management types to choose between when implementing SSO.
Dynamic User Management
In this scenario, you send a complete list of claims needed to create the user. If the provided username does not exist in our system, we create a new user. If the user does exist, the user is updated based on the information sent in the assertion. As long as you are able to send a complete set of user claims, then no additional integrations or manual intervention is needed to manage user’s accounts.
Authorization Only
In this scenario, you send only one piece of information (username, email, or external id) to identify a user. If this user exists in our system, we authenticate them and let them in. If they do not exist, they are not given access to our application. This approach is only recommended if you create and manage users via Tracker’s API.
Hybrid
In this scenario, you send a complete list of claims needed to create a user. If the provided username does not exist in our system, we create a new user. If they do exist, we let them have access to the system, but we do not update them. This approach is recommended if you have enough information to create a user, but it is not complete and you plan to update the user manually. Using Hybrid SSO, after you manually update the user’s account, the SSO integration would not overwrite your changes upon subsequent logins.
Configure Claims
We refer to the claims in this document by their Description. Be aware that when configure the claims you must use the Claim Name and Data Type.
Claim Details
|
Description |
Claim Name |
Data Type |
Notes |
|---|---|---|---|
|
Account Management Type |
accountmanagementtype |
integer |
Default is “0” = Auth Only, “1” = Dynamic, “2” Hybrid |
|
First Name |
givenname |
string |
First Name of the User (aka HR Manager, Section 2 Signatory, etc). |
|
Last Name |
surname |
string |
Last Name of the User (aka HR Manager, Section 2 Signatory, etc). |
|
Job Title |
title |
string |
The User’s job title to be displayed on the Form I-9 when signing Section 2. |
|
I-9 Complete User Role |
role |
string |
See Appx B. The role assigned to the User in our application which governs what functionality they can access. |
|
Time Zone ID |
timezoneid |
integer |
See Appx A. The timezone of the User which is used in the application to know when to send scheduled email alerts. |
|
Username |
name |
string |
This is the username for User Account. It must be unique across all clients within our system. Our suggestion is that you concatenate your Client ID with your system’s unique usernames so that you do not encounter conflicts with existing clients’ users. |
|
Email Address |
emailaddress |
string |
The User’s email address. It is used to send email alerts. |
|
Phone Number |
phone |
integer |
The User’s phone number. Must be 10 digits. |
|
Extension |
ext |
integer |
The User’s phone number extension. Must be between 1-8 digits. |
|
External ID |
externalid |
string |
An ID that originates in the client’s system used to uniquely identify a User. |
|
All Client Access |
allclientaccess |
string |
True/False flag that grants a user access to all I-9s within an employer |
|
Employer ID* |
employerid |
StringCollection |
I-9 Complete’s internal ID for an Employer. It grants the user access to all I-9s within the scope of one or more Employers. |
|
External Employer ID* |
externalemployerid |
StringCollection |
A partner’s ID or client’s ID for an Employer. It grants the user access to all I-9s within the scope of one or more Employers. |
|
Security Group ID* |
securitygroupid |
StringCollection |
I-9 Complete’s internal ID for a Security Group (which is a group of other security groups and or worksites - see attached Hierarchy Guide for details). It grants the user access to all I-9s within the scope of one or more Security Groups. |
|
External Security Group ID* |
externalsecuritygroupid |
StringCollection |
A partner’s ID or client’s ID for a Security Group (which is a group of other security groups and or worksites - see attached Hierarchy Guide for details). It grants the user access to all I-9s within the scope of one or more Security Groups. |
|
Worksite ID* |
worksiteid |
StringCollection |
I-9 Complete’s internal ID for a Worksite. It grants the user access to all I-9s within the scope of a Worksite. |
|
External Worksite ID* |
externalworkstieid |
StringCollection |
A partner’s or client’s ID for a Worksite. It grants the user access to all I-9s within the scope of a Worksite. |
* Multiple claims can be sent to assign more than one value for this claim to the user.
Claims by Account Management Type
I-9 Manager Claims
|
Description |
Dynamic User Management |
Hybrid |
Authorization Only |
|---|---|---|---|
|
Account Management Type |
required (“1”) |
required (“2”) |
do not send |
|
First Name |
required |
required |
do not send |
|
Last Name |
required |
required |
do not send |
|
Job Title |
required |
required |
do not send |
|
I-9 Complete User Role |
required |
required |
do not send |
|
Time Zone ID |
required |
required |
do not send |
|
Phone Number |
optional |
optional |
do not send |
|
Extension |
optional |
optional |
do not send |
|
Username |
required* |
required* |
One (and only one) of these three claims is required to identify the User. |
|
Email Address |
required |
required |
|
|
External ID |
optional |
optional |
|
|
All Worksite Access |
One or more (as appropriate) of these hierarchy access claims is required.** (N/A must be provided if any of these ID’s are not applicable) |
One or more (as appropriate) of these hierarchy access claims is required.** (N/A must be provided if any of these ID’s are not applicable)
|
do not send |
|
External Employer ID |
do not send |
||
|
Security Group ID |
do not send |
||
|
External Security Group ID |
do not send |
||
|
Worksite ID |
do not send |
||
|
External Worksite ID |
do not send |
||
|
Employer ID |
do not send |
* Used as the identifier to determine if the user exists already or not.
** For the user you create to have access to any Employee or Form I-9 records, you must specify access permissions for the user:
- If you send “All Client Access” then you would not send (and we would ignore) any Employer, Security Group, or Worksite values, since they overlap.
- If you send one or more Employer values, we would ignore any Security Group or Worksite values within that Employer, since they overlap.
- You may send a combination of Security Group and Worksite values, though we will ignore any worksite values that exist within the sent Security Groups, since they overlap.
Client Administrator Claims
The full claim set for the Client Administrators role is described below. Client Administrators leverage fewer claims.
|
Description |
Dynamic User Management |
Hybrid |
Authorization Only |
|---|---|---|---|
|
Account Management Type |
required (“1”) |
required (“2”) |
do not send |
|
First Name |
required |
required |
do not send |
|
Last Name |
required |
required |
do not send |
|
Job Title |
required |
required |
do not send |
|
I-9 Complete User Role |
required |
required |
do not send |
|
Username |
required* |
required* |
One (and only one) of these three claims is required to identify the User. |
|
Email Address |
required |
required |
|
|
External ID |
optional |
optional |
* Used as the identifier to determine if the user exists already or not.
Employee Claims
The full claim set for the Employee User role is described below. Employee Users leverage fewer claims
|
Description |
Dynamic User Management |
Hybrid |
Authorization Only |
|---|---|---|---|
|
Account Management Type |
required (“1”) |
required (“2”) |
do not send |
|
First Name |
required |
required |
do not send |
|
Last Name |
required |
required |
do not send |
|
I-9 Complete User Role |
required |
required |
do not send |
|
Username |
required* |
required* |
One (and only one) of these three claims is required to identify the User. |
|
Email Address |
required |
required |
|
|
External ID |
optional |
optional |
* Used as the identifier to determine if the user exists already or not.
Employee User Account
A client level feature setting must be enabled to utilize the Employee User Account SSO functionality. Please work with your implementation/account manager to enable via Client settings/Client configuration/Features/Enable Employee User Account.
IMPORTANT: An Employee Profile must be created before sending an Employee User SSO payload to the Tracker system. Use the API or UI to create and manage Employee Profiles and I-9s. The Employee Profile must contain an email address. The Email Address SSO claim must match the Email Address value on an existing Employee Profile in order to create the Employee User / Employee Profile relationship. Inserting an Email Address claim that does not match an Email Address on an existing Employee Profile will result in an error.
When the Employee User Account feature is enabled for a client, the following UI pages will enforce the Employee User authentication requirement:
- Remote Section 1 page (for the Remote Section 1 only workflow)
- Remote Section 1 page (for the Employee Appoint workflow)
- Remote Section 1 page (for the Employer Appoint workflow)
- Remote Section 1 page (for the Network Alliance workflow)
- Remote Section 1 page Amendment
Note the employee user accounts are not displayed in the Client Admin UI and therefore are not searchable in Tracker.
Testing Notes
If you are conducting rapid testing using multiple different user accounts from a single browser you may experience unexpected user flow behavior. To avoid this, clear your cookies, close your browser, and then resume your testing.
Use Cases and Error Handling
User Diagram
Use Cases
SP Initiated SSO
The following explains the different use cases and how the system will handle errors:
- User clicks on the link for Scarlet which contains ClientID in the url: https://i9complete.com/sso/C{clientId}
- Validate ClientID and Domain hint
- If ClientId does not exists, user is directed to error page with message: SSO01: ClientId is invalid.
- DomainHint is retrieved from DB based on clientId, which is used by B2C to redirect the user to their IDP login page.
- If valid proceed to step 3.
- User is directed to IDP for authorization.
- Enter username and password.
- After authorization user is created in azure b2c if it is not already there. Then, it is directed to STS application.
- Check for claim accountmanagementtype, if not present set it to Authorization Only.
- If accountmanagementtype is Authorization Only, get user information using username, email, or external id claim.
- If username Claim is given, get user information using it else get it using email or externalId.
- If none of the able is provided, user is directed to error page with message: SSO07: You must provide either a Username, Employee ID, or Email Address claim.
- If either is provided but user does not exist, then user is directed to error page with following error: SSO08: User not found.
- If user exists
- But it is not enabled, then direct to error page with message: SSO03: This account is currently inactive.
- If user does not have client associated or if client is inactive, user is directed to error page with message: SSO04: Client is inactive
- If user does not have SSO login enabled, then user is directed to error page with message: SSO05: SSO Login Access is denied.
- If user’s client does not match with given client Id, then user is directed to error page with following message: SSO14: User does not belong to the provided client.
- Else, user is authenticated and directed to scarlet application.
- If username Claim is given, get user information using it else get it using email or externalId.
- If accountmanagementtype is Dynamic User Management
- Get the user information using username.
- If user does not exist, then
- Get the name claim, if not provided user is directed to error page with message: SSO09: You must provide a Username claim.
- Get the givenname claim, if not provided user is directed to error page with message: SSO10: You must provide a value for the GivenName claim.
- Get the surname claim, if not provided user is directed to error page with message: SSO11: You must provide a value for the Surname claim.
- Get the email claim, if not provided user is directed to error page with message: SSO12: You must provide a value for the Email claim.
- If none of the following claims is provided worksiteExternalId, securityGroupExternalId, employerExternalId, worksiteId,securityGroupId, employerId, allClientAccess, then user is directed to error page with message: SSO13: You must provide the user's level of access with one or more Worksite Ids, Security Group Ids, Employer Ids, or All Worksite Access claim.
- Else, save the user, then redirect the user to scarlet application.
- If user exists
- But it is not enabled, then direct to error page with message: SSO03: This account is currently inactive.
- If user does not have client associated or if client is inactive, user is directed to error page with message: SSO04: Client is inactive
- If user does not have SSO login enabled, then user is directed to error page with message: SSO05: SSO Login Access is denied.
- If user’s client does not match with given client Id, then user is directed to error page with following message: SSO14: User does not belong to the provided client.
- Else, user account is updated and authenticated then directed to scarlet application.
- If accountmanagementtype is Hybrid
- Get the user information using username.
- If user exist, then
- If user is not enabled, then direct to error page with message: SSO03: This account is currently inactive.
- If user does not have client associated or if client is inactive, user is directed to error page with message: SSO04: Client is inactive
- If user does not have SSO login enabled, then user is directed to error page with message: SSO05: SSO Login Access is denied.
- If user’s client does not match with given client Id, then user is directed to error page with following message: SSO14: User does not belong to the provided client.
- Else, user is authenticated and directed to scarlet application.
- If user does not exist, then
- Get the name claim, if not provided user is directed to error page with message: SSO09: You must provide a Username claim.
- Get the givenname claim, if not provided user is directed to error page with message: SSO10: You must provide a value for the GivenName claim.
- Get the surname claim, if not provided user is directed to error page with message: SSO11: You must provide a value for the Surname claim.
- Get the email claim, if not provided user is directed to error page with message: SSO12: You must provide a value for the Email claim.
- If none of the following claims is provided worksiteExternalId, securityGroupExternalId, employerExternalId, worksiteId,securityGroupId, employerId, allClientAccess, then user is directed to error page with message: SSO13: You must provide the user's level of access with one or more Worksite Ids, Security Group Ids, Employer Ids, or All Worksite Access claim.
- Else, save the user, then redirect the user to scarlet application.
IDP Initiated SSO
The following explains the different use cases and how the system will handle errors:
- User navigates to their IDP and authenticates. The user has to be authenticated to access application within IDP
- Enter username and password and access to IDP.
- User click on application created in their IDP. The application User clicks on the link for Scarlet which contains ClientID and domain hint in the url: https://i9complete.com/sso/C{clientId}
- Validate ClientID and Domain hint
- If ClientId does not exists, user is directed to error page with message: SSO01: ClientId is invalid.
- DomainHint is retrieved from DB based on clientId, which is used by B2C to redirect the user to their IDP login page.
- If valid proceed to step 3.
- User is directed back to IDP for authorization. Since the user has been already authenticated when accessing to IDP it bypasses the authentication.
- User is then created in azure b2c if it is not already there. Then, it is directed to STS application.
- Check for claim accountmanagementtype, if not present set it to Authorization Only.
- If accountmanagementtype is Authorization Only, get user information using username, email, or external id claim.
- If username Claim is given, get user information using it else get it using email or externalId.
- If none of the able is provided, user is directed to error page with message: SSO07: You must provide either a Username, Employee ID, or Email Address claim.
- If either is provided but user does not exist, then user is directed to error page with following error: SSO08: User not found.
- If user exists
- But it is not enabled, then direct to error page with message: SSO03: This account is currently inactive.
- If user does not have client associated or if client is inactive, user is directed to error page with message: SSO04: Client is inactive
- If user does not have SSO login enabled, then user is directed to error page with message: SSO05: SSO Login Access is denied.
- If user’s client does not match with given client Id, then user is directed to error page with following message: SSO14: User does not belong to the provided client.
- Else, user is authenticated and directed to scarlet application.
- If username Claim is given, get user information using it else get it using email or externalId.
- If accountmanagementtype is Dynamic User Management
- Get the user information using username.
- If user does not exist, then
- Get the name claim, if not provided user is directed to error page with message: SSO09: You must provide a Username claim.
- Get the givenname claim, if not provided user is directed to error page with message: SSO10: You must provide a value for the GivenName claim.
- Get the surname claim, if not provided user is directed to error page with message: SSO11: You must provide a value for the Surname claim.
- Get the email claim, if not provided user is directed to error page with message: SSO12: You must provide a value for the Email claim.
- If none of the following claims is provided worksiteExternalId, securityGroupExternalId, employerExternalId, worksiteId,securityGroupId, employerId, allClientAccess, then user is directed to error page with message: SSO13: You must provide the user's level of access with one or more Worksite Ids, Security Group Ids, Employer Ids, or All Worksite Access claim.
- Else, save the user, then redirect the user to scarlet application
- If user exists
- But it is not enabled, then direct to error page with message: SSO03: This account is currently inactive.
- If user does not have client associated or if client is inactive, user is directed to error page with message: SSO04: Client is inactive
- If user does not have SSO login enabled, then user is directed to error page with message: SSO05: SSO Login Access is denied.
- If user’s client does not match with given client Id, then user is directed to error page with following message: SSO14: User does not belong to the provided client.
- Else, user account is updated and authenticated then directed to scarlet application.
- If accountmanagementtype is Hybrid
- Get the user information using username.
- If user exist, then
- If user is not enabled, then direct to error page with message: SSO03: This account is currently inactive.
- If user does not have client associated or if client is inactive, user is directed to error page with message: SSO04: Client is inactive
- If user does not have SSO login enabled, then user is directed to error page with message: SSO05: SSO Login Access is denied.
- If user’s client does not match with given client Id, then user is directed to error page with following message: SSO14: User does not belong to the provided client.
- Else, user is authenticated and directed to scarlet application.
- If user does not exist, then
- Get the name claim, if not provided user is directed to error page with message: SSO09: You must provide a Username claim.
- Get the givenname claim, if not provided user is directed to error page with message: SSO10: You must provide a value for the GivenName claim.
- Get the surname claim, if not provided user is directed to error page with message: SSO11: You must provide a value for the Surname claim.
- Get the email claim, if not provided user is directed to error page with message: SSO12: You must provide a value for the Email claim.
- If none of the following claims is provided worksiteExternalId, securityGroupExternalId, employerExternalId, worksiteId,securityGroupId, employerId, allClientAccess, then user is directed to error page with message: SSO13: You must provide the user's level of access with one or more Worksite Ids, Security Group Ids, Employer Ids, or All Worksite Access claim.
- Else, save the user, then redirect the user to scarlet application.
Error Codes and messages
|
Common |
Error Message |
Error Code |
|---|---|---|
|
If clientId is invalid |
SSO01: ClientId is invalid |
SSO01 |
|
If DomainHint is invalid |
SSO02: Invalid DomainHint |
SSO02 |
|
If client Id is not numeric |
SSO15: Unable to parse the Client Id. |
SSO15 |
|
If user account is inactive |
SSO03: This account is currently inactive. |
SSO03 |
|
If client is inactive |
SSO04: Client is inactive |
SSO04 |
|
If user role doesnt have SSOLoginAccess |
SSO05: SSO Login Access is denied. |
SSO05 |
|
If clientId does not match with user’s client |
SSO14: User does not belong to the provided client. |
SSO14 |
|
AuthOnly |
||
|
If user count is more than one for given email |
SSO06: Email addresses must be unique for AuthOnly requests. |
SSO06 |
|
If request is Authonly and neither username, or Employee IDor email address is provide |
SSO07: You must provide either a Username, Employee ID, or Email Address claim. |
SSO07 |
|
If request is Authonly and user is not present in tracker |
SSO08: User not found. |
SSO08 |
|
For Hybrid and Dynamic User Management to create new user: |
||
|
If name claim is not provided |
SSO09: You must provide a Username claim. |
SSO09 |
|
If givenname is not provided |
SSO10: You must provide a value for the GivenName claim. |
SSO10 |
|
If surname claim is not provided |
SSO11: You must provide a value for the Surname claim. |
SSO11 |
|
If email is not provided |
SSO12: You must provide a value for the Email claim. |
SSO12 |
|
If none of the following claims is provided worksiteExternalId,securityGroupExternalId, employerExternalId, worksiteId,securityGroupId, employerId, allClientAccess |
SSO13: You must provide the user's level of access with one or more Worksite Ids, Security Group Ids, Employer Ids, or All Worksite Access claim. |
SSO13 |
Appendices
Appendix A: User’s Time Zones (TimeZoneId)
|
|
|
notes |
|
1 |
(GMT-04:00) Atlantic Time |
Puerto Rico and the U.S. Virgin Islands |
|
2 |
(GMT-05:00) Eastern Time |
|
|
4 |
(GMT-06:00) Central Time |
|
|
5 |
(GMT-07:00) Mountain Time |
|
|
6 |
(GMT-07:00) Arizona |
Does not observe Daylight Savings Time |
|
7 |
(GMT-08:00) Pacific Time |
|
|
8 |
(GMT-09:00) Alaska |
|
|
9 |
(GMT-10:00) Hawaii |
|
Appendix B: User’s Role (Role)
|
|
notes |
|
CLIENT_ADMIN |
cannot access I-9s |
|
ADVANCED_USER |
can access I-9s |
|
ADVANCED_USER_EVERIFY |
can access I-9s |
|
INTERMEDIATE_USER |
can access I-9s |
|
INTERMEDIATE_USER_EVERIFY |
can access I-9s |
|
BASIC_USER |
can access I-9s |
|
BASIC_USER_EVERIFY |
can access I-9s |
|
EMPLOYEE_USER |
can access I-9 section 1 only |

