Migrate to Kinde for user authentication
Get started
Export your users from your existing auth system, prepare a CSV, and import them into Kinde. Users with migrated password hashes can sign in immediately with no password reset required.
If you need to catch new registrations or password changes during the migration window, combine this with the API approach or run a second import after the cutover.
email,first_name,last_name,email_verified,hashed_password,hashing_method,external_organization_idbills@company.com,Bill,Smith,TRUE,$2a$10$examplehash,bcrypt,abc001carlosg@company.com,Carlos,Garcia,TRUE,$2a$10$examplehash,bcrypt,abc001lliu@company.com,Lee,Liu,FALSE,,, xyz002Configure your Kinde business with the same auth strategies as your existing provider. See before you migrate.
Export instructions vary by provider. Select yours:
If you are migrating from your own system, prepare the data to match the format described below.
Import files must be 49MB or less. This applies to Custom CSV, Auth0 NDJSON, FusionAuth NDJSON, Custom NDJSON, Firebase NDJSON, and ASP.NET Identity CSV imports. CSV files must be encoded as UTF-8 or UTF-16 with a byte order mark (BOM). Format your export with the following columns.
Required column:
| Column | Notes |
|---|---|
email or phone | At least one login identity is required. You can include both. |
Recommended columns:
| Column | Notes |
|---|---|
first_name, last_name | User’s name |
email_verified | TRUE or FALSE |
id | Your provider’s user ID — helps match records during re-imports |
phone | International format, e.g. +61555111555. Required if you omit email |
external_organization_id | Organization ID to import the user into. Comma-separate multiple values |
role_key | Role key(s) to assign. Comma-separate multiple values |
permission_key | Permission key(s) to assign. Comma-separate multiple values |
external_organization_id is NOT the same as the Organization code in Kinde (which is Kinde-assigned). Use the ID from your own system.
Password columns:
Include these if you’re migrating hashed passwords:
| Column | Notes |
|---|---|
hashed_password | The hashed password string |
hashing_method | See supported methods below |
salt | Optional — extra characters added to strengthen the hash |
salt_position | prefix or suffix — required if salt is included |
salt_format | Format of the salt, e.g. hex or string |
variant | PBKDF2 only — required. See below |
iterations | PBKDF2 only — optional. See below |
Supported hashing methods:
| Method | Salt | Salt position |
|---|---|---|
bcrypt | — | — |
md5 | Optional | Required if salt included |
sha256 | Optional | Required if salt included |
crypt | Optional | — |
wordpress | Optional | — |
pbkdf2 | Required (base64) | — |
firebase-scrypt | Required | — |
aspnet-identity-v2 | Embedded in the hash | — |
Kinde substitutes $2b with $2a on import. These are interchangeable unless the hashes were generated on OpenBSD.
Provide the hash in hex format. For salt_format, specify hex for a hex-encoded salt (e.g. 68656c6c6f for hello). By default, the salt is treated as a plain string.
Include a base64-encoded salt and a variant of salted-pbkdf2-hmac-sha256,
salted-pbkdf2-hmac-sha256-512, or salted-pbkdf2-hmac-sha512-512. iterations is
optional and defaults to 24000. See
password data.
Use the PasswordHash value from the ASP.NET Identity AspNetUsers table exactly as
exported. The salt and other parameters are embedded in the hash, so do not include
salt, salt_position, iterations, or variant. Rows containing those values are
rejected. Kinde supports ASP.NET Identity v2 hashes, not ASP.NET Core Identity v3 hashes.
See Migrate to Kinde from ASP.NET Identity.
Check for errors before importing:
Review the CSV for missing or duplicate values. Kinde will report errors after import. Records that have already been imported without changes are skipped on re-import.
In Kinde, go to Users, then select Import users.
Select your import type:
firebase auth:export)AspNetUsers tableFollow the on-screen prompts to upload your file.
Review any errors reported after import. Fix the CSV and re-import to resolve them.
For full instructions, see Import or update users in bulk.
If users can still register or change their password while you migrate, you’ll miss them. Options:
is_password_reset_requested.Kinde does not notify users when they are imported. Plan your own communication, especially if you’re changing their sign-in experience (e.g. adding MFA or moving to passwordless).
If you need help with your migration, contact Kinde support.