In SAML metadata, what do `WantAuthnRequestsSigned`, `AuthnRequestsSigned` and `WantAssertionsSigned` declare — and what are they not?
answer
- Want means from you
- bare name means from me
- one lives on the identity-provider role
- the service-provider pair defaults false
- declaration, never enforcement
basics
~20 sThey are optional boolean declarations: the identity-provider role's WantAuthnRequestsSigned asks for signed requests, while the service-provider role's AuthnRequestsSigned says it signs its own and WantAssertionsSigned asks for signed assertions. They state expectations; they enforce nothing.
solid answer
~50 sThree optional booleans express the pair's signing policy. `WantAuthnRequestsSigned` sits on `<IDPSSODescriptor>` and says *I want the requests I receive to be signed*. `AuthnRequestsSigned` sits on `<SPSSODescriptor>` and says *I sign the requests I send*. `WantAssertionsSigned` also sits on `<SPSSODescriptor>` and says *I want the assertions delivered to me signed*. The two on the service-provider role are assumed false when omitted. The grammar is the memory aid: a `Want*` attribute states what the publisher wants **from** the counterparty; the bare `AuthnRequestsSigned` states what the publisher **does**. The thing to say out loud in an interview is what they are not: they are declarations exchanged between two parties so each can configure itself, not switches that make anything happen. Nothing in the document compels a counterparty to sign, and publishing `WantAssertionsSigned="true"` does not cause a single unsigned message to be refused.
code
xml · 18 lines<!-- the licensee's identity-provider role: an expectation -->
<md:IDPSSODescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata"
protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol"
WantAuthnRequestsSigned="true">
<md:SingleSignOnService
Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect"
Location="https://idp.operator.example/saml/sso"/>
</md:IDPSSODescriptor>
<!-- the portal's service-provider role: a promise and an expectation -->
<md:SPSSODescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata"
protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol"
AuthnRequestsSigned="true"
WantAssertionsSigned="true">
<md:AssertionConsumerService index="0" isDefault="true"
Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
Location="https://portal.regulator.example/saml/acs"/>
</md:SPSSODescriptor>go deeper
Recall that metadata can state who signs what, using boolean attributes on the role descriptors, and that stating something is not the same as doing it.
Explain which attribute lives on which role, the Want-versus-bare grammar, and that the two on the service-provider role are assumed false when they are absent.
Show the two failure shapes: an expectation nobody honoured, which fails loudly and is diagnosed by reading both documents, and an expectation nobody enforced, which fails silently and is found only by comparison.
Consider the estate: these attributes are the only machine-readable record of the pair's signing policy, so decide whether they are reviewed systematically across counterparties or set once per integration and never revisited.
## Three attributes, and which role each lives on | attribute | role descriptor | meaning | when omitted | |---|---|---|---| | `WantAuthnRequestsSigned` | `<IDPSSODescriptor>` | I want the requests I receive to be signed | optional; no requirement stated | | `AuthnRequestsSigned` | `<SPSSODescriptor>` | I sign the requests I send | assumed false | | `WantAssertionsSigned` | `<SPSSODescriptor>` | I want the assertions delivered to me signed | assumed false | All three are optional booleans. The two on the service-provider role are **assumed false when omitted**, which is worth stating explicitly: silence is a statement, and it says *no*. ## The grammar is the mnemonic The naming is consistent and candidates still reverse it under pressure: - A **`Want…`** prefix describes an expectation of the **other** party. It is a request made of whoever reads the document. - A bare attribute — `AuthnRequestsSigned` — describes the publisher's **own** behaviour. It is a promise, not a request. So a document that carries `WantAuthnRequestsSigned` is an identity-provider role asking to be sent signed requests; a document that carries `AuthnRequestsSigned` is a service-provider role announcing that it signs them. Between one pair both may be present, in the two different documents, and that is the healthy case: an expectation on one side matched by a promise on the other. ## What they are not: declarations, not controls This is the whole point of the question, and it separates people who have operated a relationship from people who have read the schema. 1. **A metadata attribute cannot make a counterparty do anything.** Publishing `WantAuthnRequestsSigned="true"` does not cause requests to arrive signed. It causes a human or a configuration process on the other side to arrange it — or not. 2. **Publishing an expectation is not enforcing it.** A party that publishes `WantAssertionsSigned="true"` and treats its own published document as the check has no check at all. The document is an announcement; the refusal has to happen where content is actually evaluated. 3. **Silence is meaningful.** Because the service-provider role's pair is assumed false when omitted, a counterparty reading your document learns that you do not sign your requests and do not require signed assertions. That may be exactly what you did not mean to say. ## The failure this produces, and how it looks In the worked setting, the regulator's portal publishes `WantAssertionsSigned="true"` and treats the matter as settled. Several hundred licensed operators read that document once, at integration time. Then: - Most configure signing, because their side reads the attribute during onboarding. - One does not — perhaps the relationship was configured before the attribute was added, perhaps the reading was manual and missed. - Content arrives from that operator without a signature, and if the portal only ever published the expectation rather than acting on it, that content is accepted. The symptom is the absence of a symptom. Nothing errors, nothing logs a mismatch, and the weakest relationship in the estate is indistinguishable from the strongest until somebody diffs the documents. The second failure is the mirror image and produces a loud break instead of a silent one: the identity-provider role publishes `WantAuthnRequestsSigned="true"`, a counterparty that omitted `AuthnRequestsSigned` sends unsigned requests, and every attempt is refused. Here the metadata contains the whole diagnosis — one side's expectation, the other side's silence — and reading both documents side by side is faster than reading any log. ## Reading a pair of documents as a policy statement A useful review habit is to lay the two documents next to each other and check that each expectation has a matching promise: - Does their `WantAuthnRequestsSigned` have your `AuthnRequestsSigned` opposite it? - Does your `WantAssertionsSigned` correspond to something the counterparty actually does? - Where an attribute is absent, has somebody decided that, or has it simply never been set? That review is cheap, it is the only place the pair's signing policy is written down in a machine-readable form, and it is the artefact an auditor can be handed. What it cannot be is the enforcement point — which bytes are covered by a signature, and how that is checked, is a separate subject from what the document says the parties expect.
- A service provider's document omits both `AuthnRequestsSigned` and `WantAssertionsSigned`. What has it told its counterparty?That it does not sign the requests it sends and does not require the assertions it receives to be signed — both are assumed false when omitted. Silence is not neutrality here. If either was meant to be true, the document is actively misinforming every counterparty that reads it during onboarding.
- Both documents in a pair are consistent, yet every login is refused. Does that rule the attributes out?It rules out the mismatch these attributes describe, which is worth ruling out first because it is cheap to check and produces exactly that symptom. It does not rule out the rest of the document — a wrong endpoint, a stale key, or an expired document produce blanket failures too.
- Why is publishing `WantAssertionsSigned="true"` not a security control?Because it acts on nobody. The attribute informs the counterparty's configuration; it does not inspect a single message. A party relying on its own published expectation, rather than on refusing content that fails to meet it, has published a policy and implemented nothing.
saying these in an interview costs you the question
- Puts WantAuthnRequestsSigned on the service-provider role
- Reads a Want attribute as a promise about one's own behaviour
- Thinks the attribute makes the counterparty sign
- Treats an omitted attribute as unspecified rather than false
- Calls the flag a security control rather than a declaration