Demos
Show your app's signed-in experience without sharing real accounts. Presenters pick "Avery Admin" or "Riley User" from a list, and no password ends up on a slide.
Fake OpenID Connect & OAuth 2.0 provider
HeyIdentity is a hosted identity provider made for development, CI and demos. Your app talks real OpenID Connect to it, but signing in means picking a test user you configured. There are no passwords and no tenant to provision. Give each user the roles and claims you need, and test Entra ID apps without an Entra tenant.
For development and testing only. HeyIdentity is not meant to protect production identities.
Show your app's signed-in experience without sharing real accounts. Presenters pick "Avery Admin" or "Riley User" from a list, and no password ends up on a slide.
Point your app at a real OIDC discovery URL and switch between users with different roles in seconds while you build authorization logic.
End-to-end tests get real signed tokens from a predictable set of users. Change a user's roles to test access control without touching a production directory.
Each configuration has its own test users. Give them roles, email or any custom claim, as strings, arrays or objects, and choose which token each claim goes into.
Discovery, Authorization Code with PKCE, client credentials, refresh tokens, userinfo, JWKS with key rotation, and sign-out through end_session_endpoint.
The Generic profile lets you choose scope or scp, string or array scopes, where roles live (for example Keycloak's realm_access.roles), and aud or client_id.
The Microsoft profile serves Entra ID v2.0 URLs and claims (tid, oid, ver, scp, client_info). Microsoft.Identity.Web and MSAL.NET work after you point Instance and TenantId at HeyIdentity; token acquisition needs one extra setting, covered in the guide.
Sign up with your email to get your own tenant, a starter configuration and a management link for editing users, clients and settings. No admin approval is needed.
Tokens are signed with per-configuration keys published at the JWKS endpoint, so your app validates them exactly as it would in production.
Every configuration has its own issuer. Use the discovery URL with any standards-compliant OIDC library.
# Discovery (Generic and Microsoft profiles)
https://app.heyidentity.dev/t/{tenantRouteId}/c/{configurationId}/.well-known/openid-configuration
# Entra ID authority (Microsoft profile): Instance = https://app.heyidentity.dev/, TenantId = {configurationId}
https://app.heyidentity.dev/{configurationId}/v2.0
builder.Services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect(options =>
{
options.Authority = "https://app.heyidentity.dev/t/{tenantRouteId}/c/{configurationId}";
options.ClientId = "my-app";
options.ClientSecret = "my-app-secret";
options.ResponseType = "code";
options.Scope.Add("email");
options.MapInboundClaims = false; // keep "roles" and "name" as issued
options.TokenValidationParameters.NameClaimType = "name";
options.TokenValidationParameters.RoleClaimType = "roles";
});
import { UserManager } from 'oidc-client-ts';
const userManager = new UserManager({
authority: 'https://app.heyidentity.dev/t/{tenantRouteId}/c/{configurationId}',
client_id: 'my-spa', // public client: PKCE, no secret
redirect_uri: `${location.origin}/callback`,
scope: 'openid profile email',
});
await userManager.signinRedirect();
import * as client from 'openid-client';
const config = await client.discovery(
new URL('https://app.heyidentity.dev/t/{tenantRouteId}/c/{configurationId}'),
'my-app',
'my-app-secret',
);
const verifier = client.randomPKCECodeVerifier();
const url = client.buildAuthorizationUrl(config, {
redirect_uri: 'http://localhost:3000/callback',
scope: 'openid profile email',
code_challenge: await client.calculatePKCECodeChallenge(verifier),
code_challenge_method: 'S256',
});
Your tenant route ID and configuration ID are shown on your management page after signup. The live demo uses public demo configurations you can try right away.
Step-by-step: Entra ID apps without a tenant, Playwright and CI tests, role-based authorization.
Run your ASP.NET Core web app, web API or MSAL client against Entra-shaped endpoints with test users and roles.
Sign in as different test users in browser tests, with real tokens and no flaky third-party login pages.
Give test users different roles and verify your access control in ASP.NET Core and SPAs.
HeyIdentity is in beta. Free covers test suites that reuse signed-in state. Pro raises the limits, so a suite can sign in once per test class, and adds session pinning. Early adopters get it free. Enterprise raises a tenant's total for suites on several runners, granted on request.
EUR 0
These limits apply once the owner's email is verified, and existing tenants keep at least these per-tenant limits. A configuration with one user never shows a picker, on every plan.
Until the owner's email is verified, lower limits apply and the tenant expires: an agent-created tenant after 7 days, an unconfirmed sign-up after 30 days. Full limits
EUR 12 per month once billing launches
Activate before 31 January 2027 and Pro is free until 31 January 2028. You activate it on your management page after your email is confirmed. No payment details are needed.
Already have a tenant? Activate Pro on your management page. Lost the link? Recover it.
On request
Full limits, including how to tell a rejected request apart.
Pin a test user in your browser and sign-ins skip the user picker.
Create a tenant in a minute. You get a starter configuration with a demo client and a test user.