Compartilhar via


Configurar o início de sessão único baseado em SAML para a sua aplicação com o Microsoft Graph

O início de sessão único (SSO) é um método de autenticação que permite aos utilizadores iniciar sessão numa aplicação e, em seguida, aceder a várias aplicações sem ter de iniciar sessão novamente. O Microsoft Entra suporta vários métodos SSO, incluindo OpenID Connect, OAuth, Security Assertion Markup Language (SAML), sSO baseado em palavra-passe e ligado. Com o Microsoft Graph, pode automatizar a configuração do SSO para a sua aplicação.

Neste tutorial, você aprende a:

  • Identificar aplicações baseadas em SAML na galeria microsoft Entra e configurar o SSO baseado em SAML para uma aplicação
  • Adicionar funções de aplicação a uma aplicação e concedê-las aos utilizadores
  • Configurar afirmações para emitir no token SAML
  • Configurar um certificado para o SSO federado
  • Obter os metadados SAML do ID do Microsoft Entra para a sua aplicação que utiliza para concluir a integração

Pré-requisitos

  • Inicie sessão num cliente de API, como o Graph Explorer , como um utilizador com a função de Administrador de Aplicações na Cloud no seu inquilino do Microsoft Entra.
  • Conceda a si mesmo as seguintes permissões delegadas: Application.ReadWrite.All, AppRoleAssignment.ReadWrite.All, Policy.Read.All, Policy.ReadWrite.ApplicationConfiguratione User.ReadWrite.All.
  • Ter um utilizador de teste para atribuir à aplicação.

Passo 1: identificar a aplicação a configurar

O Microsoft Entra ID tem uma galeria que contém milhares de aplicações pré-intuidas que pode utilizar como modelo para a sua aplicação. No Microsoft Graph, esta lista está disponível através da entidade applicationTemplate .

Neste passo, vai identificar o modelo de aplicação da aplicação AWS IAM Identity Center (successor to AWS Single Sign-On) que pretende configurar. Grave o respetivo ID.

Solicitação

GET https://graph.microsoft.com/v1.0/applicationTemplates?$filter=displayName eq 'AWS IAM Identity Center (successor to AWS Single Sign-On)'

Resposta

HTTP/1.1 200 OK
Content-type: application/json

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#applicationTemplates",
    "@microsoft.graph.tips": "Use $select to choose only the properties your app needs, as this can lead to performance improvements. For example: GET applicationTemplates?$select=categories,description",
    "value": [
        {
            "id": "21ed01d2-ec13-4e9e-86c1-cd546719ebc4",
            "displayName": "AWS IAM Identity Center (successor to AWS Single Sign-On)",
            "homePageUrl": "https://aws.amazon.com/",
            "supportedSingleSignOnModes": [
                "saml",
                "external"
            ],
            "supportedProvisioningTypes": [
                "sync"
            ],
            "logoUrl": "https://galleryapplogos1.azureedge.net/app-logo/awssinglesignon_FC86917E_215.png",
            "categories": [
                "developerServices",
                "itInfrastructure",
                "security",
                "New"
            ],
            "publisher": "Amazon Web Services, Inc.",
            "description": "Federate once to AWS IAM Identity Center (successor to AWS Single Sign-On) & use it to centrally manage access to multiple AWS accounts and IAM Identity Center enabled apps. Provision users via SCIM."
        }
    ]
}

Passo 2: instanciar a aplicação

Com o valor de ID do modelo de aplicação, crie uma instância da aplicação no seu inquilino. Aqui, vai dar o nome AWS Contoso à aplicação. A resposta inclui um objeto de aplicação e principal de serviço para o AWS Contoso, que é uma instância do Centro de Identidades do IAM do AWS (sucessor da aplicação Início de Sessão Único do AWS ). Registe os IDs dos dois objetos para utilização posteriormente neste tutorial.

Solicitação

POST https://graph.microsoft.com/v1.0/applicationTemplates/21ed01d2-ec13-4e9e-86c1-cd546719ebc4/instantiate
Content-type: application/json

{
  "displayName": "AWS Contoso"
}

Resposta

HTTP/1.1 201 Created
Content-type: application/json

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#microsoft.graph.applicationServicePrincipal",
    "application": {
        "id": "b7308000-8bb3-467b-bfc7-8dbbfd759ad9",
        "appId": "2fbc8259-0f56-4f56-9870-93a228020936",
        "applicationTemplateId": "21ed01d2-ec13-4e9e-86c1-cd546719ebc4",
        "createdDateTime": "2024-02-21T17:14:33Z",
        "deletedDateTime": null,
        "displayName": "AWS Contoso",
        "description": null,
        "groupMembershipClaims": null,
        "identifierUris": [],
        "isFallbackPublicClient": false,
        "signInAudience": "AzureADMyOrg",
        "tags": [],
        "tokenEncryptionKeyId": null,
        "defaultRedirectUri": null,
        "samlMetadataUrl": null,
        "optionalClaims": null,
        "addIns": [],
        "api": {
            "acceptMappedClaims": null,
            "knownClientApplications": [],
            "requestedAccessTokenVersion": null,
            "oauth2PermissionScopes": [
                {
                    "adminConsentDescription": "Allow the application to access AWS Contoso on behalf of the signed-in user.",
                    "adminConsentDisplayName": "Access AWS Contoso",
                    "id": "f5419931-094d-481d-b801-ab3ed60d48d8",
                    "isEnabled": true,
                    "type": "User",
                    "userConsentDescription": "Allow the application to access AWS Contoso on your behalf.",
                    "userConsentDisplayName": "Access AWS Contoso",
                    "value": "user_impersonation"
                }
            ],
            "preAuthorizedApplications": []
        },
        "appRoles": [
            {
                "allowedMemberTypes": [
                    "User"
                ],
                "displayName": "User",
                "id": "8774f594-1d59-4279-b9d9-59ef09a23530",
                "isEnabled": true,
                "description": "User",
                "value": null,
                "origin": "Application"
            },
            {
                "allowedMemberTypes": [
                    "User"
                ],
                "displayName": "msiam_access",
                "id": "e7f1a7f3-9eda-48e0-9963-bd67bf531afd",
                "isEnabled": true,
                "description": "msiam_access",
                "value": null,
                "origin": "Application"
            }
        ],
        "info": {
            "logoUrl": null,
            "marketingUrl": null,
            "privacyStatementUrl": null,
            "supportUrl": null,
            "termsOfServiceUrl": null
        },
        "keyCredentials": [],
        "parentalControlSettings": {
            "countriesBlockedForMinors": [],
            "legalAgeGroupRule": "Allow"
        },
        "passwordCredentials": [],
        "publicClient": {
            "redirectUris": []
        },
        "requiredResourceAccess": [],
        "verifiedPublisher": {
            "displayName": null,
            "verifiedPublisherId": null,
            "addedDateTime": null
        },
        "web": {
            "homePageUrl": "https://*.signin.aws.amazon.com/platform/saml/acs/*?metadata=awssinglesignon|ISV9.1|primary|z",
            "redirectUris": [
                "https://*.signin.aws.amazon.com/platform/saml/acs/*"
            ],
            "logoutUrl": null
        }
    },
    "servicePrincipal": {
        "id": "d3616293-fff8-4415-9f01-33b05dad1b46",
        "deletedDateTime": null,
        "accountEnabled": true,
        "appId": "2fbc8259-0f56-4f56-9870-93a228020936",
        "applicationTemplateId": "21ed01d2-ec13-4e9e-86c1-cd546719ebc4",
        "appDisplayName": "AWS Contoso",
        "alternativeNames": [],
        "appOwnerOrganizationId": "38d49456-54d4-455d-a8d6-c383c71e0a6d",
        "displayName": "AWS Contoso",
        "appRoleAssignmentRequired": true,
        "loginUrl": null,
        "logoutUrl": null,
        "homepage": "https://*.signin.aws.amazon.com/platform/saml/acs/*?metadata=awssinglesignon|ISV9.1|primary|z",
        "notificationEmailAddresses": [],
        "preferredSingleSignOnMode": null,
        "preferredTokenSigningKeyThumbprint": null,
        "replyUrls": [],
        "servicePrincipalNames": [
            "2fbc8259-0f56-4f56-9870-93a228020936"
        ],
        "servicePrincipalType": "Application",
        "tags": [
            "WindowsAzureActiveDirectoryIntegratedApp"
        ],
        "tokenEncryptionKeyId": null,
        "samlSingleSignOnSettings": null,
        "addIns": [],
        "appRoles": [
            {
                "allowedMemberTypes": [
                    "User"
                ],
                "displayName": "User",
                "id": "8774f594-1d59-4279-b9d9-59ef09a23530",
                "isEnabled": true,
                "description": "User",
                "value": null,
                "origin": "Application"
            },
            {
                "allowedMemberTypes": [
                    "User"
                ],
                "displayName": "msiam_access",
                "id": "e7f1a7f3-9eda-48e0-9963-bd67bf531afd",
                "isEnabled": true,
                "description": "msiam_access",
                "value": null,
                "origin": "Application"
            }
        ],
        "info": {
            "logoUrl": null,
            "marketingUrl": null,
            "privacyStatementUrl": null,
            "supportUrl": null,
            "termsOfServiceUrl": null
        },
        "keyCredentials": [],
        "oauth2PermissionScopes": [
            {
                "adminConsentDescription": "Allow the application to access AWS Contoso on behalf of the signed-in user.",
                "adminConsentDisplayName": "Access AWS Contoso",
                "id": "f5419931-094d-481d-b801-ab3ed60d48d8",
                "isEnabled": true,
                "type": "User",
                "userConsentDescription": "Allow the application to access AWS Contoso on your behalf.",
                "userConsentDisplayName": "Access AWS Contoso",
                "value": "user_impersonation"
            }
        ],
        "passwordCredentials": [],
        "verifiedPublisher": {
            "displayName": null,
            "verifiedPublisherId": null,
            "addedDateTime": null
        }
    }
}

Passo 3: Configurar o início de sessão único

Neste passo, vai configurar o SSO para a aplicação AWS Contoso e o principal de serviço. Para a aplicação, configure os URLs SAML enquanto estiver no principal de serviço, defina o modo SSO como saml.

Passo 3.1: Definir o modo de início de sessão único para o principal de serviço

Defina saml como o modo SSO para o principal de serviço que criou no Passo 2. A solicitação retorna o código de resposta 204 No Content.

PATCH https://graph.microsoft.com/v1.0/servicePrincipals/d3616293-fff8-4415-9f01-33b05dad1b46
Content-type: application/json

{
  "preferredSingleSignOnMode": "saml"
}

Passo 3.2: Definir URLs SAML básicos para a aplicação

Neste passo, defina osredirectUris da Web/ e osRedirectUris da Web/ para a aplicação que criou no Passo 2. A solicitação retorna o código de resposta 204 No Content.

PATCH https://graph.microsoft.com/v1.0/applications/b7308000-8bb3-467b-bfc7-8dbbfd759ad9
Content-type: application/json

{
    "identifierUris": [
        "https://signin.aws.amazon.com/saml"
    ],
    "web": {
        "redirectUris": [
            "https://signin.aws.amazon.com/saml"
        ]
    }
}

Passo 4: Adicionar funções de aplicação

Se o aplicativo exigir as informações da função no token, adicione a definição das funções no objeto do aplicativo. Por predefinição, o objeto appRoles na aplicação e principal de serviço no Passo 2 incluía a predefinição User e msiam_access as funções. Não os modifique nem remova. Para adicionar mais funções, tem de incluir as funções existentes e as novas funções no objeto appRoles no pedido. Caso contrário, as funções existentes são substituídas.

Neste passo, adicione as Finance,WAAD funções e Admin,WAAD ao principal de serviço da Contoso do AWS. A solicitação retorna o código de resposta 204 No Content.

PATCH https://graph.microsoft.com/v1.0/servicePrincipals/d3616293-fff8-4415-9f01-33b05dad1b46
Content-type: application/json

{
    "appRoles": [
        {
            "allowedMemberTypes": [
                "User"
            ],
            "description": "User",
            "displayName": "User",
            "id": "8774f594-1d59-4279-b9d9-59ef09a23530",
            "isEnabled": true,
            "origin": "Application",
            "value": null
        },
        {
            "allowedMemberTypes": [
                "User"
            ],
            "description": "msiam_access",
            "displayName": "msiam_access",
            "id": "e7f1a7f3-9eda-48e0-9963-bd67bf531afd",
            "isEnabled": true,
            "origin": "Application",
            "value": null
        },
        {
            "allowedMemberTypes": [
                "User"
            ],
            "description": "Admin,WAAD",
            "displayName": "Admin,WAAD",
            "id": "3a84e31e-bffa-470f-b9e6-754a61e4dc63",
            "isEnabled": true,
            "value": "arn:aws:iam::212743507312:role/accountname-aws-admin,arn:aws:iam::212743507312:saml-provider/WAAD"
        },
        {
            "allowedMemberTypes": [
                "User"
            ],
            "description": "Finance,WAAD",
            "displayName": "Finance,WAAD",
            "id": "7a960000-ded3-455b-8c04-4f2ace00319b",
            "isEnabled": true,
            "value": "arn:aws:iam::212743507312:role/accountname-aws-finance,arn:aws:iam::212743507312:saml-provider/WAAD"
        }
    ]
}

Passo 5: Configurar o mapeamento de afirmações

Quer configurar os atributos SAML ao mapear os campos do Microsoft Entra ID com atributos de aplicação específicos do Centro de Identidades do IAM do AWS. Por conseguinte, cria uma política de mapeamento de afirmações e atribui-a ao principal de serviço.

Passo 5.1: Criar uma política de mapeamento de afirmações

Para além das afirmações básicas, configure as seguintes afirmações para o Microsoft Entra ID emitir no token SAML:

Nome da declaração Origem
https://aws.amazon.com/SAML/Attributes/Role assignedroles
https://aws.amazon.com/SAML/Attributes/RoleSessionName userprincipalname
https://aws.amazon.com/SAML/Attributes/SessionDuration "900"
appRoles assignedroles
http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier userprincipalname

Observação

Algumas chaves na política de mapeamento de afirmações, como a Versão, são sensíveis a maiúsculas e minúsculas. A mensagem de erro "A propriedade tem um valor inválido" pode ser um problema de sensibilidade a maiúsculas e minúsculas.

Crie a política de mapeamento de afirmações e registe o respetivo ID para utilização posteriormente neste tutorial.

Solicitação

POST https://graph.microsoft.com/v1.0/policies/claimsMappingPolicies
Content-type: application/json

{
    "definition": [
        "{\"ClaimsMappingPolicy\":{\"Version\":1,\"IncludeBasicClaimSet\":\"true\", \"ClaimsSchema\": [{\"Source\":\"user\",\"ID\":\"assignedroles\",\"SamlClaimType\": \"https://aws.amazon.com/SAML/Attributes/Role\"}, {\"Source\":\"user\",\"ID\":\"userprincipalname\",\"SamlClaimType\": \"https://aws.amazon.com/SAML/Attributes/RoleSessionName\"}, {\"Value\":\"900\",\"SamlClaimType\": \"https://aws.amazon.com/SAML/Attributes/SessionDuration\"}, {\"Source\":\"user\",\"ID\":\"assignedroles\",\"SamlClaimType\": \"appRoles\"}, {\"Source\":\"user\",\"ID\":\"userprincipalname\",\"SamlClaimType\": \"https://aws.amazon.com/SAML/Attributes/nameidentifier\"}]}}"
    ],
    "displayName": "AWS Claims Policy",
    "isOrganizationDefault": false
}

Resposta

HTTP/1.1 201 Created
Content-type: application/json

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#policies/claimsMappingPolicies/$entity",
    "id": "92037c7a-a875-49a0-814e-8ec30f880e2e",
    "deletedDateTime": null,
    "definition": [
        "{\"ClaimsMappingPolicy\":{\"Version\":1,\"IncludeBasicClaimSet\":\"true\", \"ClaimsSchema\": [{\"Source\":\"user\",\"ID\":\"assignedroles\",\"SamlClaimType\": \"https://aws.amazon.com/SAML/Attributes/Role\"}, {\"Source\":\"user\",\"ID\":\"userprincipalname\",\"SamlClaimType\": \"https://aws.amazon.com/SAML/Attributes/RoleSessionName\"}, {\"Value\":\"900\",\"SamlClaimType\": \"https://aws.amazon.com/SAML/Attributes/SessionDuration\"}, {\"Source\":\"user\",\"ID\":\"assignedroles\",\"SamlClaimType\": \"appRoles\"}, {\"Source\":\"user\",\"ID\":\"userprincipalname\",\"SamlClaimType\": \"https://aws.amazon.com/SAML/Attributes/nameidentifier\"}]}}"
    ],
    "displayName": "AWS Claims Policy",
    "isOrganizationDefault": false
}

Passo 5.2: Atribuir a política de mapeamento de afirmações ao principal de serviço

A solicitação retorna o código de resposta 204 No Content.

POST https://graph.microsoft.com/v1.0/servicePrincipals/ef04fead-8549-4e59-b5f7-d1d8c697ec64/claimsMappingPolicies/$ref
Content-type: application/json

{
    "@odata.id": "https://graph.microsoft.com/v1.0/policies/claimsMappingPolicies/92037c7a-a875-49a0-814e-8ec30f880e2e"
}

Passo 6: Configurar um certificado de assinatura

Precisa de um certificado que o Microsoft Entra ID possa utilizar para assinar uma resposta SAML. Pode utilizar o /addTokenSigningCertificate ponto final para criar um certificado de assinatura de tokens para o principal de serviço. Em alternativa, pode criar um certificado autoassinado e carregá-lo para o principal de serviço.

Depois de adicionar o certificado, o principal de serviço contém dois objetos na coleção keyCredentials : um para a chave privada e outro para a chave pública; e um objeto na coleção passwordCredentials para a palavra-passe do certificado.

Opção 1: Criar um certificado de assinatura de tokens para o principal de serviço

Solicitação

POST https://graph.microsoft.com/v1.0/servicePrincipals/d3616293-fff8-4415-9f01-33b05dad1b46/addTokenSigningCertificate
Content-type: application/json

{
    "displayName": "CN=AWSContoso",
    "endDateTime": "2027-01-22T00:00:00Z"
}

Resposta

HTTP/1.1 200 OK
Content-type: application/json

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#microsoft.graph.selfSignedCertificate",
    "customKeyIdentifier": "wt3YBEyVas0CaadaZLeGLbndrD4=",
    "displayName": "CN=AWSContoso",
    "endDateTime": "2027-01-22T00:00:00Z",
    "key": "MIICqjCCAZKgAwIBAgIIZYCy..KlDixjUT61i4tFs=",
    "keyId": "04e5ac4e-31f9-41ad-83e2-6dd41e1d81f4",
    "startDateTime": "2024-02-21T17:09:35.0006942Z",
    "thumbprint": "C2DDD8044C956ACD0269A75A64B7862DB9DDAC3E",
    "type": "AsymmetricX509Cert",
    "usage": "Verify"
}

Opção 2: Criar um certificado de assinatura personalizado

Pode utilizar os seguintes scripts do PowerShell e C# para obter um certificado autoassinado para teste. Utilize as melhores práticas de segurança da sua empresa para criar um certificado de assinatura para produção.

O script seguinte cria um certificado autoassinado com o nome que atribui fqdn quando lhe for pedido, por exemplo, CN=AWSContoso. Protege o certificado com a palavra-passe que fornece pwd e exporta os certificados PFX e CER para a localização especificada em location.

Param(
    [Parameter(Mandatory=$true)]
    [string]$fqdn,
    [Parameter(Mandatory=$true)]
    [string]$pwd,
    [Parameter(Mandatory=$true)]
    [string]$location
) 

if (!$PSBoundParameters.ContainsKey('location'))
{
    $location = "."
} 

$cert = New-SelfSignedCertificate -certstorelocation cert:\currentuser\my -DnsName $fqdn
$pwdSecure = ConvertTo-SecureString -String $pwd -Force -AsPlainText
$path = 'cert:\currentuser\my\' + $cert.Thumbprint
$cerFile = $location + "\\" + $fqdn + ".cer"
$pfxFile = $location + "\\" + $fqdn + ".pfx" 

Export-PfxCertificate -cert $path -FilePath $pfxFile -Password $pwdSecure
Export-Certificate -cert $path -FilePath $cerFile

Extrair detalhes do certificado

No passo anterior, tem os certificados CER e PFX. Extraia os valores da chave privada, palavra-passe, chave pública e o thumbprint do certificado para adicionar ao principal de serviço.

Extrair o thumbprint do certificado
Solicitação

O seguinte script do PowerShell permite-lhe extrair o thumbprint do ficheiro CER. Substitua o caminho do ficheiro pela localização do certificado.

## Replace the file path with the source of your certificate

Get-PfxCertificate -Filepath "C:\Users\admin\Desktop\CN=AWSContoso.cer" | Out-File -FilePath "C:\Users\admin\Desktop\CN=AWSContoso.cer.thumbprint.txt"
Resposta

O ficheiro CN=AWSContoso.cer.thumbprint.txt tem uma entrada semelhante à seguinte saída.

Thumbprint                                Subject              EnhancedKeyUsageList
----------                                -------              --------------------
5214D6BA9438F984A0CC2C856CCEA6A76EDCEC3A  CN=AWSContoso        {Client Authentication, Server Authentication}
Extrair a chave de certificado

O seguinte script do PowerShell permite-lhe extrair a chave pública do ficheiro CER. Substitua o caminho do ficheiro pela localização do certificado.

Solicitação
[convert]::ToBase64String((Get-Content C:\Users\admin\Desktop\CN=AWSContoso.cer -AsByteStream -Raw))  | Out-File -FilePath "C:\Users\admin\Desktop\CN=AWSContoso.cer.key.txt"
Resposta

O ficheiro CN=AWSContoso.cer.key.txt tem um valor codificado base64 semelhante ao seguinte resultado truncado.

MIIDHjCCAgagAwIBAgIQYDbahiL7NY...6qCMVJKHAQGzGwg==

Adicionar a chave de assinatura personalizada

Adicione os seguintes detalhes a keyCredentials e passwordCredentials para o principal de serviço. Quando os dois objetos tiverem as mesmas propriedades, tem de atribuir os mesmos valores para essas propriedades.

  • CustomKeyIdentifier é o hash de thumbprint do certificado.
  • StartDateTime é a data em que ou após a criação do certificado.
  • O endDateTime pode ser um máximo de três anos a partir do startDateTime. Se não for especificado, o sistema atribui automaticamente uma data um ano após startDateTime.
  • O tipo e a utilização têm de ser:
    • AsymmetricX509Cert e Verify , respetivamente, no mesmo objeto.
    • X509CertAndPassword e Sign , respetivamente, no mesmo objeto.
  • Atribua o nome do requerente do certificado à propriedade displayName .
  • A chave é o valor codificado Base64 que gerou no passo anterior.
  • O keyId é um GUID que pode definir.

A solicitação retorna o código de resposta 204 No Content.

PATCH https://graph.microsoft.com/v1.0/servicePrincipals/ef04fead-8549-4e59-b5f7-d1d8c697ec64
Content-type: application/json

{
    "keyCredentials": [
        {
            "customKeyIdentifier": "5214D6BA9438F984A0CC2C856CCEA6A76EDCEC3A",
            "endDateTime": "2027-01-22T00:00:00Z",
            "keyId": "4c266507-3e74-4b91-aeba-18a25b450f6e",
            "startDateTime": "2024-02-21T17:09:35Z",
            "type": "X509CertAndPassword",
            "usage": "Sign",
            "key": "MIICqjCCAZKgAwIBAgIIZYCy..KlDixjUT61i4tFs=",
            "displayName": "CN=AWSContoso"
        },
        {
            "customKeyIdentifier": "5214D6BA9438F984A0CC2C856CCEA6A76EDCEC3A",
            "endDateTime": "2027-01-22T00:00:00Z",
            "keyId": "e35a7d11-fef0-49ad-9f3e-aacbe0a42c42",
            "startDateTime": "2024-02-21T17:09:35Z",
            "type": "AsymmetricX509Cert",
            "usage": "Verify",
            "key": "MIICqjCCAZKgAwIBAgIIZYCy..KlDixjUT61i4tFs=",
            "displayName": "CN=AWSContoso"
        }
    ],
    "passwordCredentials": [
        {
            "customKeyIdentifier": "5214D6BA9438F984A0CC2C856CCEA6A76EDCEC3A",
            "keyId": "4c266507-3e74-4b91-aeba-18a25b450f6e",
            "endDateTime": "2022-01-27T19:40:33Z",
            "startDateTime": "2027-01-22T00:00:00Z",
            "secretText": "61891f4ee44d"
        }
    ]
}

Adicionar a chave de assinatura personalizada

Tem de definir a propriedade preferredTokenSigningKeyThumbprint do principal de serviço para o thumbprint do certificado que pretende que o Microsoft Entra ID utilize para assinar a resposta SAML. A solicitação retorna o código de resposta 204 No Content.

Solicitação

PATCH https://graph.microsoft.com/v1.0/servicePrincipals/d3616293-fff8-4415-9f01-33b05dad1b46
Content-type: application/json

{
    "preferredTokenSigningKeyThumbprint": "5214D6BA9438F984A0CC2C856CCEA6A76EDCEC3A"
}

Passo 7: atribuir utilizadores à aplicação

Atribuir um usuário ao aplicativo

Atribua o utilizador que criou ao principal de serviço e conceda-lhe a função de aplicação Admin,WAAD . No corpo do pedido, forneça os seguintes valores:

  • principalId – o ID da conta de utilizador que criou.
  • appRoleId – o ID da função de aplicação Admin,WAAD que adicionou.
  • resourceId – o ID do principal de serviço.

Solicitação

POST https://graph.microsoft.com/v1.0/servicePrincipals/d3616293-fff8-4415-9f01-33b05dad1b46/appRoleAssignments
Content-type: application/json

{
    "principalId": "59bb3898-0621-4414-ac61-74f9d7201355",
    "principalType": "User",
    "appRoleId": "3a84e31e-bffa-470f-b9e6-754a61e4dc63",
    "resourceId": "d3616293-fff8-4415-9f01-33b05dad1b46"
}

Resposta

HTTP/1.1 201 Created
Content-type: application/json

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#servicePrincipals('d3616293-fff8-4415-9f01-33b05dad1b46')/appRoleAssignments/$entity",
    "id": "mDi7WSEGFESsYXT51yATVdouI-92Rw1OgPSpSxEvaLg",
    "deletedDateTime": null,
    "appRoleId": "3a84e31e-bffa-470f-b9e6-754a61e4dc63",
    "createdDateTime": "2024-02-21T18:07:54.7959075Z",
    "principalDisplayName": "Adele Vance",
    "principalId": "59bb3898-0621-4414-ac61-74f9d7201355",
    "principalType": "User",
    "resourceDisplayName": "AWS Contoso",
    "resourceId": "d3616293-fff8-4415-9f01-33b05dad1b46"
}

Passo 8: Obter metadados SAML do Microsoft Entra ID para a aplicação AWS Contoso

Utilize o SEGUINTE URL para obter os metadados SAML do Microsoft Entra ID para a aplicação AWS Contoso. Substitua {tenant-id} pelo ID do inquilino e {appId} pelo appId da aplicação AWS Contoso. Os metadados contêm informações como o certificado de assinatura, o EntityID da Microsoft Entra e o Microsoft Entra SingleSignOnService, entre outros.

https://login.microsoftonline.com/{tenant-id}/federationmetadata/2007-06/federationmetadata.xml?appid={appId}

Segue-se um exemplo do que poderá ver para a sua aplicação. Guarde os dados no formato XML.

<EntityDescriptor xmlns="urn:oasis:names:tc:SAML:2.0:metadata" ID="_26313693-22d4-4361-8e48-ea19bb8616e1" entityID="https://sts.windows.net/38d49456-54d4-455d-a8d6-c383c71e0a6d/">
<RoleDescriptor xmlns:fed="http://docs.oasis-open.org/wsfed/federation/200706" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="fed:SecurityTokenServiceType" protocolSupportEnumeration="http://docs.oasis-open.org/wsfed/federation/200706">
<fed:ClaimTypesOffered>
...
<IDPSSODescriptor protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
<SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://login.microsoftonline.com/38d49456-54d4-455d-a8d6-c383c71e0a6d/saml2"/>
<SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://login.microsoftonline.com/38d49456-54d4-455d-a8d6-c383c71e0a6d/saml2"/>
<SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://login.microsoftonline.com/38d49456-54d4-455d-a8d6-c383c71e0a6d/saml2"/>
</IDPSSODescriptor>
</EntityDescriptor>

Passo 9: Concluir e testar a integração

Agora que concluiu os passos de configuração da aplicação no Microsoft Entra ID e tem os metadados SAML, inicie sessão no site da empresa do AWS IAM Identity Center como administrador e:

  1. Conclua os passos para Configurar o SSO do Centro de Identidades do IAM do AWS.
  2. Crie um utilizador de teste cujo nome de utilizador e endereço de e-mail correspondam à conta de utilizador que criou no Microsoft Entra ID.
  3. Teste a integração do SSO.

Passo 10: Limpar recursos

Neste passo, remova os recursos que criou e já não precisa.

Excluir o aplicativo

Quando elimina a aplicação, o principal de serviço no seu inquilino também é eliminado. A solicitação retorna o código de resposta 204 No Content.

DELETE https://graph.microsoft.com/v1.0/applications/b7308000-8bb3-467b-bfc7-8dbbfd759ad9

Eliminar a conta de utilizador de teste

A solicitação retorna o código de resposta 204 No Content.

DELETE https://graph.microsoft.com/v1.0/users/59bb3898-0621-4414-ac61-74f9d7201355

Excluir a política de mapeamento de declarações

A solicitação retorna o código de resposta 204 No Content.

DELETE https://graph.microsoft.com/v1.0/policies/claimsMappingPolicies/a4b35718-fd5e-4ca8-8248-a3c9934b1b78