Step by step
1
Start the transaction
The app redirects the user to
/connect/authorize. Veriqa opens a transaction with the
client context, a correlation id, a lifetime and the chosen channel, and renders the sign-in
page with a QR code and channel buttons.2
Confirm in the channel
The user opens the trusted channel on their phone (Telegram / WhatsApp / other channels /
Email) and confirms the sign-in. The channel adapter returns the resolved identity to the
transaction.
3
Completion
The desktop app learns that the sign-in is complete via a live update (SignalR) or by polling
the transaction status, after which Veriqa builds a
ClaimsPrincipal and hands it to OpenIddict.4
Token issuance
OpenIddict issues an authorization code; the app exchanges it for tokens at
/connect/token.
From there it is standard OIDC.Starting the sign-in again
A user may start a sign-in to the same application again — in a new tab or with a second scan — and reach the channel with the same account. This closes any earlier sign-ins by that account to that application still waiting for an answer, including a sign-in waiting for missing claims. Only the one that reached the channel last stays:- the chat gets no message about the closed sign-ins — no receipt and no “time expired” notice. If the user taps a button on a question left in the chat, they get the usual expired receipt;
- their open pages show the expired screen and stay where they are: your application receives no
erroronredirect_urifor a sign-in the user has left; - in events, the audit trail and the transaction status such a sign-in is a failed transaction with
the reason
superseded_by_new_sign_in; in metrics its outcome issuperseded.
Veriqa vs OIDC terms
Further reading
OIDC + Veriqa explained
Exactly where Veriqa slots into the standard OIDC flow — and what it doesn’t do.
.NET quickstart
Wire the flow into your application.