The client shows a second box after the password field, you type the code from the hardware token, and the login still fails with an authentication error. That box exists, so the profile asked for it. Whether the server ever received the value in a form it understands is a different question, and it is the one worth answering first.

Start from the prompt your client actually shows

A profile can carry a static challenge directive with a prompt string and a flag that controls whether the response is echoed as you type. The prompt is what you see in the dialog; the flag is a display preference for that same input. Neither of them tells the server how to verify anything.

Count the fields you were actually given. One field for a username plus one masked field is a normal password login with no challenge at all. A second field that appears after the password, with its own label, is the client implementing the challenge interaction.

If the second box never appears in the client you are using, that client may not implement the interaction, or it may implement it only through a different front end such as a management interface. Checking the client is cheaper than rewriting the profile, and it is usually where the mismatch actually lives.

What the server has to already support

The profile describes what the client should collect. It does not enable verification on the server, and a server without the corresponding authentication integration will simply receive a password it does not recognise. That is why some deployments show the prompt and reject every code, and why the operator's answer about which mechanism performs the check is the one that matters.

Ask the operator which mechanism performs the check. It may be a plugin that speaks to PAM, a script hook that validates the response against a token service, or a management-based integration that parses the packed value itself. Each of those expects a slightly different input.

This is also where expectations need calibrating. A second prompt is an input mechanism, not proof that a second factor is enforced, because enforcement happens on the server side and only shows up when you test a wrong code.

The encoded field the management interface sends

When a front end drives the connection through the management interface, the password and the challenge response are packed into a single value before submission. The management interface reference documents the format: a prefix, then the password and the response as separate Base64 components.

Base64 is an encoding, not a protection. It hides nothing from anyone who can read the field, and it does not convert a one-time code into something reusable. The packed value deserves the same handling as a password: out of shared profiles, out of command lines, and out of diagnostic logs.

That encoding is also the most common source of confusion, because there are now three shapes that look similar and are not interchangeable. A plain credentials file holds a password. A literal concatenation of password and code holds a different string. A management client's packed response holds a third. Confirm which one your verification path expects before changing a field just because an error went away.

Static versus dynamic: different timing

A static challenge is known before the first credential is submitted, so the client can ask for it up front. A dynamic challenge arrives later, sent by the authentication workflow after an exchange has already begun, and it needs a client that can handle a mid-conversation request.

Support for one does not give you the other. A profile directive that configures a static prompt does not implement a server-initiated challenge, and a front end that handles dynamic requests may still not display a static one. Reading which side initiated the request is the fastest way to tell them apart.

Unattended operation is where this becomes a design question rather than a UI question. A saved code is not a durable boot-time credential, and a reconnect hours later will need fresh input unless the deployment supports a token arrangement that the operator has enabled deliberately.

Test success and failure, not just the dialog

Run both halves of the test. Correct credentials with a valid response should succeed; correct credentials with a deliberately wrong response should be denied. If both succeed, the client is collecting input that nothing verifies, and the dialog has been mistaken for a control. That single test catches more deployments than any amount of profile review.

Then repeat the connection after a reconnect, with an account that is not enrolled, and through whatever client your users actually run. The prompt appearing is a client behaviour; the denial of a wrong code is the server enforcing something.

Artihkkalat mat laktásit