SAML-protocol voor eenmalige aanmelding
In dit artikel gaat het over de SAML 2.0-verificatie aanvragen en -antwoorden die Azure Active Directory (Azure AD) ondersteunt voor eenmalige aanmelding (SSO).
In het onderstaande protocoldiagram wordt de sequentie voor eenmalige aanmelding beschreven. De cloudservice (de serviceprovider) gebruikt een HTTP-omleidingsbinding om een AuthnRequest
-element (verificatieaanvraag) door te geven aan Azure AD (de id-provider). Azure AD gebruikt vervolgens een HTTP POST-binding om een Response
-element te posten in de cloudservice.
Notitie
In dit artikel wordt besproken hoe u SAML gebruikt voor eenmalige aanmelding. Zie Eenmalige aanmelding bij toepassingen in Azure Active Directory voor meer informatie over andere manieren om eenmalige aanmelding te verwerken (bijvoorbeeld met behulp van OpenID Connect of geïntegreerde Windows-verificatie).
AuthnRequest
Als u een gebruikersverificatie wilt aanvragen, verzenden cloudservices een AuthnRequest
-element naar Azure AD. Een voorbeeld van een SAML 2.0-AuthnRequest
kan eruitzien als in het volgende voorbeeld:
<samlp:AuthnRequest
xmlns="urn:oasis:names:tc:SAML:2.0:metadata"
ID="id6c1c178c166d486687be4aaf5e482730"
Version="2.0" IssueInstant="2013-03-18T03:28:54.1839884Z"
xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol">
<Issuer xmlns="urn:oasis:names:tc:SAML:2.0:assertion">https://www.contoso.com</Issuer>
</samlp:AuthnRequest>
Parameter | Type | Beschrijving |
---|---|---|
Id | Vereist | Azure AD gebruikt dit kenmerk om het InResponseTo -kenmerk van het geretourneerde antwoord in te vullen. Id mag niet beginnen met een getal, dus een algemene strategie is om een tekenreeks zoals 'ID' vooraf te laten gaan aan de tekenreeksweergave van een GUID. id6c1c178c166d486687be4aaf5e482730 is bijvoorbeeld een geldige id. |
Versie | Vereist | Deze parameter moet worden ingesteld op 2.0. |
IssueInstant | Vereist | Dit is een Datum/tijd-tekenreeks met een UTC-waarde en retourindeling ('o'). Azure AD verwacht een Datum/tijd-waarde van dit type, maar evalueert of gebruikt de waarde niet. |
AssertionConsumerServiceURL | Optioneel | Indien opgegeven, moet deze parameter overeenkomen met de RedirectUri van de cloudservice in Azure AD. |
ForceAuthn | Optioneel | Dit is een booleaanse waarde. Als deze waar is, betekent dit dat de gebruiker wordt gedwongen zich opnieuw te verifiëren, zelfs als deze een geldige sessie met Azure AD heeft. |
IsPassive | Optioneel | Dit is een booleaanse waarde die aangeeft of Azure AD de gebruiker op de achtergrond moet verifiëren, zonder tussenkomst van de gebruiker, met behulp van de sessiecookie als deze bestaat. Als deze waar is, probeert Azure AD de gebruiker te verifiëren met behulp van de sessiecookie. |
Alle andere AuthnRequest
-kenmerken, zoals Consent, Destination, AssertionConsumerServiceIndex, AttributeConsumerServiceIndex en ProviderName, worden genegeerd.
Azure AD negeert ook het Conditions
-element in AuthnRequest
.
Verlener
Het Issuer
-element in een AuthnRequest
moet exact overeenkomen met een van de ServicePrincipalNames in de cloudservice in Azure AD. Dit is doorgaans ingesteld op de App-id-URI die is opgegeven tijdens de registratie van de toepassing.
Een SAML-fragment met het Issuer
-element ziet eruit als in het volgende voorbeeld:
<Issuer xmlns="urn:oasis:names:tc:SAML:2.0:assertion">https://www.contoso.com</Issuer>
NameIDPolicy
Dit element vraagt een bepaalde naam/id-indeling aan in het antwoord en is optioneel in AuthnRequest
-elementen die naar Azure AD worden verzonden.
Een NameIdPolicy
-element ziet eruit als in het volgende voorbeeld:
<NameIDPolicy Format="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"/>
Als NameIDPolicy
wordt opgegeven, kunt u het bijbehorende optionele Format
-kenmerk hierin opnemen. Het Format
-kenmerk kan slechts één van de volgende waarden hebben. Elke andere waarde resulteert in een fout.
urn:oasis:names:tc:SAML:2.0:nameid-format:persistent
: Azure Active Directory geeft de NameID-claim op als paarsgewijze id.urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress
: Azure Active Directory geeft de NameID-claim op in de notatie van een e-mailadres.urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified
: met deze waarde kan Azure Active Directory de claimindeling selecteren. Azure Active Directory geeft de NameID op als paarsgewijze id.urn:oasis:names:tc:SAML:2.0:nameid-format:transient
: Azure Active Directory geeft de NameID-claim op als een willekeurig gegenereerde waarde die uniek is voor de huidige SSO-bewerking. Dit betekent dat de waarde tijdelijk is en niet kan worden gebruikt om de verifiërende gebruiker te identificeren.
Als SPNameQualifier
wordt opgegeven, bevat Azure AD hetzelfde SPNameQualifier
in het antwoord.
Azure AD negeert het AllowCreate
-kenmerk.
RequestedAuthnContext
Het RequestedAuthnContext
-element geeft de gewenste verificatiemethoden op. Het is optioneel bij AuthnRequest
-elementen die naar Azure AD worden verzonden. Azure AD ondersteunt AuthnContextClassRef
-waarden zoals urn:oasis:names:tc:SAML:2.0:ac:classes:Password
.
Bereik bepalen
Het Scoping
-element, dat een lijst met id-providers bevat, is optioneel in AuthnRequest
-elementen die naar Azure AD worden verzonden.
Als dit wordt opgegeven, neemt u het ProxyCount
-kenmerk, het IDPListOption
- of RequesterID
-element niet op, omdat deze niet worden ondersteund.
Handtekening
Een Signature
-element bij AuthnRequest
-elementen is optioneel. Azure AD kan worden geconfigureerd (preview) om de vereiste van ondertekende verificatieaanvragen af te dwingen. Als dit is ingeschakeld, worden alleen ondertekende verificatieaanvragen geaccepteerd, anders wordt de verificatie van de aanvrager geleverd door alleen te reageren op geregistreerde URL's van Assertion Consumer Service.
Onderwerp
Neem geen Subject
-element op. Azure AD biedt geen ondersteuning voor het opgeven van een onderwerp in AuthnRequest
en retourneert een fout als er een is opgegeven.
Een onderwerp kan in plaats daarvan worden opgegeven door een login_hint
-parameter toe te voegen aan de URL van de HTTP-aanvraag voor eenmalige aanmelding, met de NameID van het onderwerp als parameterwaarde.
Antwoord
Wanneer een aangevraagde aanmelding is voltooid, plaatst Azure AD een reactie op de cloudservice. Een antwoord op een geslaagde aanmeldingspoging ziet eruit als in het volgende voorbeeld:
<samlp:Response ID="_a4958bfd-e107-4e67-b06d-0d85ade2e76a" Version="2.0" IssueInstant="2013-03-18T07:38:15.144Z" Destination="https://contoso.com/identity/inboundsso.aspx" InResponseTo="id758d0ef385634593a77bdf7e632984b6" xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol">
<Issuer xmlns="urn:oasis:names:tc:SAML:2.0:assertion"> https://login.microsoftonline.com/82869000-6ad1-48f0-8171-272ed18796e9/</Issuer>
<ds:Signature xmlns:ds="https://www.w3.org/2000/09/xmldsig#">
...
</ds:Signature>
<samlp:Status>
<samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success" />
</samlp:Status>
<Assertion ID="_bf9c623d-cc20-407a-9a59-c2d0aee84d12" IssueInstant="2013-03-18T07:38:15.144Z" Version="2.0" xmlns="urn:oasis:names:tc:SAML:2.0:assertion">
<Issuer>https://login.microsoftonline.com/82869000-6ad1-48f0-8171-272ed18796e9/</Issuer>
<ds:Signature xmlns:ds="https://www.w3.org/2000/09/xmldsig#">
...
</ds:Signature>
<Subject>
<NameID>Uz2Pqz1X7pxe4XLWxV9KJQ+n59d573SepSAkuYKSde8=</NameID>
<SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
<SubjectConfirmationData InResponseTo="id758d0ef385634593a77bdf7e632984b6" NotOnOrAfter="2013-03-18T07:43:15.144Z" Recipient="https://contoso.com/identity/inboundsso.aspx" />
</SubjectConfirmation>
</Subject>
<Conditions NotBefore="2013-03-18T07:38:15.128Z" NotOnOrAfter="2013-03-18T08:48:15.128Z">
<AudienceRestriction>
<Audience>https://www.contoso.com</Audience>
</AudienceRestriction>
</Conditions>
<AttributeStatement>
<Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name">
<AttributeValue>testuser@contoso.com</AttributeValue>
</Attribute>
<Attribute Name="http://schemas.microsoft.com/identity/claims/objectidentifier">
<AttributeValue>3F2504E0-4F89-11D3-9A0C-0305E82C3301</AttributeValue>
</Attribute>
...
</AttributeStatement>
<AuthnStatement AuthnInstant="2013-03-18T07:33:56.000Z" SessionIndex="_bf9c623d-cc20-407a-9a59-c2d0aee84d12">
<AuthnContext>
<AuthnContextClassRef> urn:oasis:names:tc:SAML:2.0:ac:classes:Password</AuthnContextClassRef>
</AuthnContext>
</AuthnStatement>
</Assertion>
</samlp:Response>
Antwoord
Het Response
-element bevat het resultaat van de autorisatieaanvraag. Azure AD stelt de waarden ID
, Version
en IssueInstant
in het Response
-element in. Ook worden de volgende kenmerken ingesteld:
Destination
: wanneer de aanmelding is voltooid, is dit ingesteld op deRedirectUri
van de serviceprovider (cloudservice).InResponseTo
: dit is ingesteld op hetID
-kenmerk van hetAuthnRequest
-element dat het antwoord heeft geïnitieerd.
Verlener
Azure AD stelt het Issuer
-element https://sts.windows.net/<TenantIDGUID>/
in op de locatie waar <TenantIDGUID> de tenant-id van de Azure AD-tenant is.
Een antwoord met het Issuer-element kan er bijvoorbeeld uitzien als in het volgende voorbeeld:
<Issuer xmlns="urn:oasis:names:tc:SAML:2.0:assertion"> https://sts.windows.net/82869000-6ad1-48f0-8171-272ed18796e9/</Issuer>
Status
Het Status
-element geeft het succes of falen van de aanmelding aan. Het bevat het StatusCode
-element, met een code of een set geneste codes die de status van de aanvraag weergeeft. Het bevat ook het StatusMessage
-element, met aangepaste foutberichten die tijdens het aanmeldingsproces worden gegenereerd.
Het volgende voorbeeld is een SAML-antwoord op een mislukte aanmeldingspoging.
<samlp:Response ID="_f0961a83-d071-4be5-a18c-9ae7b22987a4" Version="2.0" IssueInstant="2013-03-18T08:49:24.405Z" InResponseTo="iddce91f96e56747b5ace6d2e2aa9d4f8c" xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol">
<Issuer xmlns="urn:oasis:names:tc:SAML:2.0:assertion">https://sts.windows.net/82869000-6ad1-48f0-8171-272ed18796e9/</Issuer>
<samlp:Status>
<samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Requester">
<samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:RequestUnsupported" />
</samlp:StatusCode>
<samlp:StatusMessage>AADSTS75006: An error occurred while processing a SAML2 Authentication request. AADSTS90011: The SAML authentication request property 'NameIdentifierPolicy/SPNameQualifier' is not supported.
Trace ID: 66febed4-e737-49ff-ac23-464ba090d57c
Timestamp: 2013-03-18 08:49:24Z</samlp:StatusMessage>
</samlp:Status>
</samlp:Response>
Assertie
Naast ID
, IssueInstant
en Version
stelt Azure AD de volgende elementen in het Assertion
-element van het antwoord in.
Verlener
Dit wordt ingesteld op https://sts.windows.net/<TenantIDGUID>/
, waarbij <TenantIDGUID> de tenant-id van de Azure AD-tenant is.
<Issuer>https://sts.windows.net/82869000-6ad1-48f0-8171-272ed18796e9/</Issuer>
Handtekening
Azure AD ondertekent de assertie in antwoord op een geslaagde aanmelding. Het Signature
-element bevat een digitale handtekening die de cloudservice kan gebruiken om de bron te verifiëren, zodat de integriteit van de assertie kan worden geverifieerd.
Azure AD gebruikt de ondertekeningssleutel in het IDPSSODescriptor
-element van het bijbehorende metagegevensdocument om deze digitale handtekening te genereren.
<ds:Signature xmlns:ds="https://www.w3.org/2000/09/xmldsig#">
digital_signature_here
</ds:Signature>
Onderwerp
Hiermee wordt het principe aangegeven dat het onderwerp is van de -instructies in de assertie. Het bevat een NameID
-element, dat de geverifieerde gebruiker weergeeft. De NameID
-waarde is een doel-id die alleen wordt doorgestuurd naar de serviceprovider die de doelgroep voor het token is. Dit is permanent; het kan worden ingetrokken, maar wordt nooit opnieuw toegewezen. De waarde is ook ondoorzichtig, omdat deze niets onthult over de gebruiker en niet kan worden gebruikt als id voor query's naar kenmerken.
Het Method
-kenmerk van het SubjectConfirmation
-element is altijd ingesteld op urn:oasis:names:tc:SAML:2.0:cm:bearer
.
<Subject>
<NameID>Uz2Pqz1X7pxe4XLWxV9KJQ+n59d573SepSAkuYKSde8=</NameID>
<SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
<SubjectConfirmationData InResponseTo="id758d0ef385634593a77bdf7e632984b6" NotOnOrAfter="2013-03-18T07:43:15.144Z" Recipient="https://contoso.com/identity/inboundsso.aspx" />
</SubjectConfirmation>
</Subject>
Voorwaarden
Dit element geeft voorwaarden op waarmee het acceptabele gebruik van SAML-asserties wordt gedefinieerd.
<Conditions NotBefore="2013-03-18T07:38:15.128Z" NotOnOrAfter="2013-03-18T08:48:15.128Z">
<AudienceRestriction>
<Audience>https://www.contoso.com</Audience>
</AudienceRestriction>
</Conditions>
Het NotBefore
- en NotOnOrAfter
-kenmerk geven het interval op waarin de assertie geldig is.
- De waarde van het
NotBefore
-kenmerk is op hetzelfde tijdstip als of iets (minder dan een seconde) later dan de waarde van hetIssueInstant
-kenmerk van hetAssertion
-element. Azure AD houdt geen rekening met enig tijdsverschil tussen zichzelf en de cloudservice (serviceprovider) en voegt geen buffer toe aan deze tijd. - De waarde van het
NotOnOrAfter
-kenmerk is 70 minuten later dan de waarde van hetNotBefore
-kenmerk.
Doelgroep
Dit bevat een URI die een beoogde doelgroep identificeert. Azure AD stelt de waarde van dit element in op de waarde van het Issuer
-element van de AuthnRequest
waarmee de aanmelding is gestart. Als u de Audience
-waarde wilt evalueren, gebruikt u de waarde van de App ID URI
die is opgegeven tijdens de registratie van de toepassing.
<AudienceRestriction>
<Audience>https://www.contoso.com</Audience>
</AudienceRestriction>
Net als bij de Issuer
-waarde moet de Audience
-waarde exact overeenkomen met een van de SPN-namen waarmee de cloudservice in Azure AD wordt weergegeven. Als de waarde van het Issuer
-element echter geen URI-waarde is, is de Audience
-waarde in het antwoord de Issuer
-waarde met het voorvoegsel spn:
.
AttributeStatement
Dit bevat claims over het onderwerp of de gebruiker. Het volgende fragment bevat een voorbeeldelement AttributeStatement
. Het beletselteken geeft aan dat het element meerdere kenmerken en kenmerkwaarden kan bevatten.
<AttributeStatement>
<Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name">
<AttributeValue>testuser@contoso.com</AttributeValue>
</Attribute>
<Attribute Name="http://schemas.microsoft.com/identity/claims/objectidentifier">
<AttributeValue>3F2504E0-4F89-11D3-9A0C-0305E82C3301</AttributeValue>
</Attribute>
...
</AttributeStatement>
- Name Claim: de waarde van het
Name
-kenmerk (http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name
) is de user-principal name van de geverifieerde gebruiker, zoalstestuser@managedtenant.com
. - ObjectIdentifier Claim: de waarde van het
ObjectIdentifier
-kenmerk (http://schemas.microsoft.com/identity/claims/objectidentifier
) is deObjectId
van het mapobject dat de geverifieerde gebruiker in Azure AD weergeeft.ObjectId
is een onveranderbare, wereldwijd unieke id van de geverifieerde gebruiker die veilig opnieuw kan worden gebruikt.
AuthnStatement
Dit element bevestigt dat het onderwerp van de assertie op een bepaald moment via een bepaalde methode is geverifieerd.
- Het
AuthnInstant
-kenmerk geeft het tijdstip aan waarop de gebruiker is geverifieerd met Azure AD. - Het
AuthnContext
-element geeft de verificatiecontext op die wordt gebruikt om de gebruiker te verifiëren.
<AuthnStatement AuthnInstant="2013-03-18T07:33:56.000Z" SessionIndex="_bf9c623d-cc20-407a-9a59-c2d0aee84d12">
<AuthnContext>
<AuthnContextClassRef> urn:oasis:names:tc:SAML:2.0:ac:classes:Password</AuthnContextClassRef>
</AuthnContext>
</AuthnStatement>