Поделиться через


Настройка единого входа на основе SAML для приложения с помощью Microsoft Graph

Единый вход (SSO) — это метод проверки подлинности, позволяющий пользователям входить в одно приложение, а затем получать доступ к нескольким приложениям без необходимости повторного входа. Microsoft Entra поддерживает различные методы единого входа, включая OpenID Connect, OAuth, SAML, единый вход на основе пароля и связанный единый вход. С помощью Microsoft Graph можно автоматизировать настройку единого входа для приложения.

В этом руководстве рассказывается, как:

  • Определение приложений на основе SAML в коллекции Microsoft Entra и настройка единого входа на основе SAML для приложения
  • Добавление ролей приложения в приложение и предоставление их пользователям
  • Настройка утверждений для выдачи в токене SAML
  • Настройка сертификата для федеративного единого входа
  • Получите метаданные SAML идентификатора Microsoft Entra для приложения, которые вы используете для завершения интеграции.

Предварительные условия

  • Войдите в клиент API, например Graph Explorer , в качестве пользователя с ролью администратора облачных приложений в клиенте Microsoft Entra.
  • Предоставьте себе следующие делегированные разрешения: Application.ReadWrite.All, AppRoleAssignment.ReadWrite.All, Policy.Read.All, Policy.ReadWrite.ApplicationConfigurationи User.ReadWrite.All.
  • Назначьте тестового пользователя приложению.

Шаг 1. Определение приложения для настройки

Microsoft Entra ID содержит коллекцию, содержащую тысячи предварительно созданных приложений, которые можно использовать в качестве шаблона для приложения. В Microsoft Graph этот список доступен через сущность applicationTemplate .

На этом шаге вы определите шаблон приложения для AWS IAM Identity Center (successor to AWS Single Sign-On) приложения, которое требуется настроить. Запишите его идентификатор.

Запрос

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

Отклик

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."
        }
    ]
}

Шаг 2. Создание экземпляра приложения

Используя значение id для шаблона приложения, создайте экземпляр приложения в клиенте. Здесь вы назовете приложение AWS Contoso. Ответ включает в себя объект приложения и субъекта-службы для AWS Contoso, который является экземпляром AWS IAM Identity Center (преемником aws Single Sign-On) приложения. Запишите идентификаторы двух объектов для использования далее в этом руководстве.

Запрос

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

{
  "displayName": "AWS Contoso"
}

Отклик

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
        }
    }
}

Шаг 3. Настройка единого входа

На этом шаге вы настроите единый вход как для приложения AWS Contoso, так и для субъекта-службы. Для приложения вы настраиваете URL-адреса SAML, а для субъекта-службы — для режима samlединого входа значение .

Шаг 3.1. Настройка режима единого входа для субъекта-службы

Задайте saml режим единого входа для субъекта-службы, созданного на шаге 2. Запрос возвращает код отклика 204 No Content.

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

{
  "preferredSingleSignOnMode": "saml"
}

Шаг 3.2. Установка базовых URL-адресов SAML для приложения

На этом шаге задайте веб-redirectUris/ и web/redirectUris для приложения, созданного на шаге 2. Запрос возвращает код отклика 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"
        ]
    }
}

Шаг 4. Добавление ролей приложения

Если приложение ожидает получить сведения о роли в маркере, добавьте определение ролей в объект приложения. По умолчанию объект appRoles в приложении и субъекте-службе на шаге 2 включал роли и msiam_access по умолчаниюUser. Не изменяйте и не удаляйте их. Чтобы добавить дополнительные роли, необходимо включить в запрос как существующие, так и новые роли в объекте appRoles . В противном случае существующие роли будут заменены.

На этом шаге Finance,WAAD добавьте роли и Admin,WAAD в субъект-службу AWS Contoso. Запрос возвращает код отклика 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"
        }
    ]
}

Шаг 5. Настройка сопоставления утверждений

Вы хотите настроить атрибуты SAML, сопоставив поля идентификатора Microsoft Entra с определенными атрибутами приложения AWS IAM Identity Center. Таким образом, вы создаете политику сопоставления утверждений и назначаете ее субъекту-службе.

Шаг 5.1. Создание политики сопоставления утверждений

В дополнение к базовым утверждениям настройте следующие утверждения для идентификатора Microsoft Entra id для выдачи в токене SAML:

Имя утверждения Источник
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

Примечание.

Некоторые ключи в политике сопоставления утверждений, например Версия, чувствительны к регистру. Сообщение об ошибке "Свойство имеет недопустимое значение" может быть проблемой с конфиденциальностью регистра.

Создайте политику сопоставления утверждений и запишите ее идентификатор для последующего использования в этом руководстве.

Запрос

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
}

Отклик

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
}

Шаг 5.2. Назначение политики сопоставления утверждений субъекту-службе

Запрос возвращает код отклика 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"
}

Шаг 6. Настройка сертификата подписи

Вам нужен сертификат, который microsoft Entra ID может использовать для подписи ответа SAML. Вы можете использовать конечную /addTokenSigningCertificate точку для создания сертификата подписи маркера для субъекта-службы. Кроме того, можно создать самозаверяющий сертификат и передать его субъекту-службе.

После добавления сертификата субъект-служба содержит два объекта в коллекции keyCredentials : один для закрытого ключа и один для открытого ключа; и объект в коллекции passwordCredentials для пароля сертификата.

Вариант 1. Создание сертификата подписи маркера для субъекта-службы

Запрос

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"
}

Отклик

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"
}

Вариант 2. Создание настраиваемого сертификата подписи

Чтобы получить самозаверяющий сертификат для тестирования, можно использовать следующие скрипты PowerShell и C#. Используйте лучшие методики безопасности вашей компании, чтобы создать сертификат подписи для рабочей среды.

Следующий скрипт создает самозаверяющий сертификат с именем, который вы предоставляете при fqdn появлении запроса, например CN=AWSContoso. Он защищает сертификат с помощью пароля, который вы указали в pwd , и экспортирует сертификаты PFX и CER в расположение, указанное в 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

Извлечение сведений о сертификате

На предыдущем шаге у вас есть сертификаты CER и PFX. Извлеките значения закрытого ключа, пароля, открытого ключа и отпечатка сертификата для добавления в субъект-службу.

Извлечение отпечатка сертификата
Запрос

Следующий скрипт PowerShell позволяет извлечь отпечаток из CER-файла. Замените путь к файлу расположением сертификата.

## 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"
Отклик

Файл CN=AWSContoso.cer.thumbprint.txt содержит запись, аналогичную приведенной ниже.

Thumbprint                                Subject              EnhancedKeyUsageList
----------                                -------              --------------------
5214D6BA9438F984A0CC2C856CCEA6A76EDCEC3A  CN=AWSContoso        {Client Authentication, Server Authentication}
Извлечение ключа сертификата

Следующий скрипт PowerShell позволяет извлечь открытый ключ из CER-файла. Замените путь к файлу расположением сертификата.

Запрос
[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"
Отклик

Cn=AWSContoso.cer.key.txt файл имеет значение в кодировке Base64, аналогичное следующему усеченному выходу.

MIIDHjCCAgagAwIBAgIQYDbahiL7NY...6qCMVJKHAQGzGwg==

Добавление пользовательского ключа подписывания

Добавьте следующие сведения в keyCredentials и passwordCredentials для субъекта-службы. Если два объекта имеют одинаковые свойства, для этих свойств необходимо присвоить одинаковые значения.

  • CustomKeyIdentifier — это хэш отпечатка сертификата.
  • StartDateTime — это дата создания или после создания сертификата.
  • Значение endDateTime может быть не более трех лет с момента startDateTime. Если это не указано, система автоматически назначает дату через год после startDateTime.
  • Тип и использование должны быть следующими:
    • AsymmetricX509Cert и Verify соответственно в одном объекте.
    • X509CertAndPassword и Sign соответственно в одном объекте.
  • Назначьте имя субъекта сертификата свойству displayName .
  • Ключ — это значение в кодировке Base64, созданное на предыдущем шаге.
  • KeyId — это guid, который можно определить.

Запрос возвращает код отклика 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"
        }
    ]
}

Активация пользовательского ключа подписывания

Необходимо задать для свойства preferredTokenSigningKeyThumbprint субъекта-службы отпечаток сертификата, который вы хотите использовать идентификатором Microsoft Entra для подписи ответа SAML. Запрос возвращает код отклика 204 No Content.

Запрос

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

{
    "preferredTokenSigningKeyThumbprint": "5214D6BA9438F984A0CC2C856CCEA6A76EDCEC3A"
}

Шаг 7. Назначение пользователей приложению

Назначение пользователя приложению

Назначьте созданного пользователя субъекту-службе и предоставьте ему Admin,WAAD роль приложения. В тексте запроса укажите следующие значения:

  • principalId — идентификатор созданной учетной записи пользователя.
  • appRoleId — идентификатор добавленной Admin,WAAD роли приложения.
  • resourceId — идентификатор субъекта-службы.

Запрос

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"
}

Отклик

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"
}

Шаг 8. Получение метаданных SAML идентификатора Microsoft Entra для приложения AWS Contoso

Используйте следующий URL-адрес, чтобы получить метаданные MICROSOFT Entra ID SAML для приложения AWS Contoso. Замените {tenant-id} идентификатором клиента и {appId} appId приложения AWS Contoso. Метаданные содержат такие сведения, как сертификат подписи, Идентификатор сущности Microsoft Entra и Microsoft Entra SingleSignOnService.

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

Ниже показан пример того, что можно увидеть для приложения. Сохраните данные в формате 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>

Шаг 9. Завершение и тестирование интеграции

Теперь, когда вы выполнили действия по настройке приложения в Microsoft Entra ID и получили метаданные SAML, войдите на корпоративный сайт AWS IAM Identity Center в качестве администратора и выполните следующие действия:

  1. Выполните действия, описанные в статье Настройка единого входа AWS IAM Identity Center.
  2. Создайте тестового пользователя, имя пользователя и адрес электронной почты которого соответствуют учетной записи пользователя, созданной в идентификаторе Microsoft Entra.
  3. Протестируйте интеграцию единого входа.

Шаг 10. Очистка ресурсов

На этом шаге удалите созданные ресурсы, которые больше не нужны.

Удаление приложения

При удалении приложения субъект-служба в клиенте также удаляется. Запрос возвращает код отклика 204 No Content.

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

Удаление тестовой учетной записи пользователя

Запрос возвращает код отклика 204 No Content.

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

Удаление политики сопоставления утверждений

Запрос возвращает код отклика 204 No Content.

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