

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Tutoriel IAM : Utiliser un CloudFormation modèle pour créer un fournisseur d'identité SAML (IdP) et un rôle IAM fédéré SAML
<a name="tutorial_saml-idp-and-federated-role"></a>

Pour vous familiariser avec la fédération SAML et ses fonctionnalités, vous allez utiliser un CloudFormation modèle pour configurer un fournisseur d'identité (IdP) SAML et le rôle IAM fédéré associé. Ce didacticiel vous montre comment créer les deux ressources ensemble dans une seule pile.

Le modèle crée un IdP SAML qui peut être utilisé pour un accès fédéré AWS aux ressources, ainsi qu'un rôle IAM qui fait confiance au fournisseur SAML. Les utilisateurs authentifiés par votre IdP externe peuvent assumer ce rôle pour accéder aux AWS ressources.

Les ressources déployées sont composées des éléments suivants :
+ Un IdP SAML configuré avec le document de métadonnées de votre IdP.
+ Un rôle IAM fédéré qui fait confiance à l’IdP SAML et peut être endossé par des utilisateurs authentifiés.
+ Des politiques gérées configurables qui peuvent être associées au rôle afin d’accorder des autorisations spécifiques.

## Conditions préalables
<a name="tutorial_saml-idp-and-federated-role-prereqs"></a>

Le didacticiel présume que vous avez déjà ce qui suit en place :
+ Python 3.6 ou version ultérieure installée sur votre ordinateur local pour exécuter la commande Python utilisée dans ce didacticiel afin de formater le fichier XML des métadonnées SAML de votre IdP.
+ Un document de métadonnées SAML provenant de votre IdP externe enregistré sous forme de fichier XML.

## Créez un IdP et un rôle SAML à l'aide de CloudFormation
<a name="tutorial_saml-idp-and-federated-role-create"></a>

Pour créer l'IdP SAML et le rôle fédéré, vous allez créer CloudFormation un modèle et l'utiliser pour créer une pile contenant les deux ressources.

### Création du modèle
<a name="tutorial_saml-idp-and-federated-role-file"></a>

Créez d'abord le CloudFormation modèle.

1. Dans la section [Modèle](#tutorial_saml-idp-and-federated-role-template), cliquez sur l’icône de copie dans l’onglet **JSON** ou **YAML** pour copier le contenu du modèle.

1. Copiez le contenu du modèle dans un nouveau fichier.

1. Enregistrez le fichier au niveau local.

### Créez la pile .
<a name="tutorial_saml-idp-and-federated-role-stack"></a>

Ensuite, utilisez le modèle que vous avez enregistré pour approvisionner une CloudFormation pile.

1. Ouvrez la CloudFormation console à l'adresse [https://console.aws.amazon.com/cloudformation.](https://console.aws.amazon.com/cloudformation/)

1. Sur la page **Piles**, dans le menu **Créer une pile**, choisissez **Avec de nouvelles ressources (standard)**.

1. Spécifiez un modèle :

   1. Sous **Prérequis**, choisissez **Choisir un modèle existant**.

   1. Sous **Spécifier le modèle**, sélectionnez **Charger un modèle de fichier**.

   1. Choisissez **Choisir un fichier**, accédez au fichier du modèle, puis sélectionnez-le.

   1. Choisissez **Suivant**.

1. Spécifiez les détails de la pile suivants :

   1. Saisissez le nom de la pile.

   1. En **IdentityProviderName**effet, vous pouvez laisser ce champ vide pour générer automatiquement un nom basé sur le nom de la pile, ou saisir un nom personnalisé pour votre IdP SAML.

      Exemple : `CompanyIdP` ou `EnterpriseSSO`

   1. Pour **IdentityProviderSAMLMetadataDocument**, vous devez formater votre fichier XML de métadonnées SAML sur une seule ligne avant de le coller dans ce champ. Cela est nécessaire car la CloudFormation console exige que le contenu XML soit formaté sur une seule ligne lorsqu'il est transmis via les paramètres de la console.

      Utilisez la commande Python suivante pour reformater votre fichier XML :

      ```
      python3 -c "import sys, re; content=open(sys.argv[1]).read(); print(re.sub(r'>\s+<', '><', content.replace('\n', '').replace('\r', '').strip()))" saml-metadata.xml
      ```
**Note**  
Le document de métadonnées SAML de l’IdP doit être formaté en une seule ligne pour la saisie des paramètres de la console. La commande Python supprime les sauts de ligne et les espaces supplémentaires afin de créer le format requis tout en conservant l’intégralité du contenu et de la structure d’origine.

      Copiez le résultat de la commande Python et collez-le dans le champ **IdentityProviderSAMLMetadataDocument**.

      Exemple de document de métadonnées SAML formaté (abrégé) :

      ```
      <?xml version="1.0" encoding="UTF-8"?><md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" entityID="https://portal.sso.example.com/saml/assertion/CompanyIdP"><md:IDPSSODescriptor WantAuthnRequestsSigned="false" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol"><md:KeyDescriptor use="signing"><ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#"><ds:X509Data><ds:X509Certificate>MIIDXTCCAkWgAwIBAgIJAJC1HiIAZAiIMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV...</ds:X509Certificate></ds:X509Data></ds:KeyInfo></md:KeyDescriptor><md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://portal.sso.example.com/saml/logout/CompanyIdP"/><md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:persistent</md:NameIDFormat><md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://portal.sso.example.com/saml/assertion/CompanyIdP"/></md:IDPSSODescriptor></md:EntityDescriptor>
      ```

   1. En **RoleName**effet, vous pouvez laisser ce champ vide pour générer automatiquement un nom basé sur le nom de la pile, ou saisir un nom personnalisé pour le rôle IAM fédéré.

      Exemple : `SAML-Developer-Access` ou `SAML-ReadOnly-Role`

   1. Pour les autres paramètres, acceptez les valeurs par défaut ou saisissez les vôtres en fonction de vos besoins :
      + **IdentityProviderAddPrivateKey**- Clé privée optionnelle pour déchiffrer les assertions SAML
      + **IdentityProviderAssertionEncryptionMode**- Mode de chiffrement pour les assertions SAML

        Exemples de valeurs : `Allowed`, `Required`, ou laissez vide pour aucun chiffrement
      + **RoleSessionDuration**- Durée maximale de session en secondes (3600-43200, 7200 par défaut)

        Exemple : `14400` (4 heures)
      + **RolePermissionsBoundary**- ARN facultatif d'une politique de limite d'autorisations

        Exemple : `arn:aws:iam::123456789012:policy/DeveloperBoundary`
      + **RolePath**- Chemin pour le rôle IAM (la valeur par défaut est/)

        Exemple : `/saml-roles/`
      + **RoleManagedPolicy1-5** - Possibilité ARNs de joindre jusqu'à 5 politiques gérées

        Exemple pour RoleManagedPolicy 1 : `arn:aws:iam::aws:policy/ReadOnlyAccess`

        Exemple pour RoleManagedPolicy 2 : `arn:aws:iam::123456789012:policy/CustomPolicy`

   1. Choisissez **Suivant**.

1. Configurez les options de pile :

   1. Sous **Options d’échec de pile**, choisissez **Supprimer toutes les ressources nouvellement créées**.
**Note**  
Le choix de cette option vous évite d’être facturé pour des ressources dont la politique de suppression indique qu’elles doivent être conservées même en cas d’échec de la création de la pile.

   1. Acceptez toutes les autres valeurs par défaut.

   1. Sous **Fonctionnalités**, cochez la case pour confirmer que des ressources IAM CloudFormation peuvent être créées dans votre compte.

   1. Choisissez **Suivant**.

1. Vérifiez les détails de la pile et choisissez **Envoyer**.

CloudFormation crée la pile. Une fois la création de la pile terminée, les ressources de la pile sont prêtes à être utilisées. Vous pouvez utiliser l’onglet **Ressources** de la page détaillée de la pile pour afficher les ressources provisionnées dans votre compte.

La pile produira les valeurs suivantes, que vous pouvez consulter dans l’onglet **Sorties** :
+ **RoleARN** : ARN du rôle IAM créé (par exemple, `arn:aws:iam::123456789012:role/SAML-Developer-Access` ou `arn:aws:iam::123456789012:role/stack-name-a1b2c3d4` si vous utilisez un nom généré automatiquement).
+ **IdentityProviderARN** : ARN de l'IdP SAML créé (par exemple`arn:aws:iam::123456789012:saml-provider/CompanyIdP`,).

Vous aurez besoin de ces deux éléments ARNs lors de la configuration de votre IdP afin d'envoyer les attributs SAML appropriés pour l'attribution des rôles.

## Tester la fédération SAML
<a name="tutorial_saml-idp-and-federated-role-using"></a>

Une fois que l’IdP SAML et le rôle fédéré ont été créés, vous pouvez tester la configuration de la fédération.

1. Ouvrez la console IAM à l’adresse [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/).

1. Dans le panneau de navigation, sélectionnez **Identity providers (Fournisseurs d'identité)**.

   Vous devez voir votre IdP SAML nouvellement créé dans la liste.

1. Choisissez le nom de l’IdP pour en afficher les détails.

   Sur la page de détails de l’IdP, vous pouvez consulter le document de métadonnées SAML et d’autres détails de configuration.

1. Dans le panneau de navigation, choisissez **Rôles**.

1. Trouvez et choisissez le rôle fédéré que vous venez de créer.

   Sur la page de détails du rôle, vous pouvez voir la politique de confiance qui permet à l’IdP SAML d’endosser ce rôle.

1. Choisissez l’onglet **Relations de confiance** pour consulter la politique de confiance.

   La politique de confiance doit indiquer que l’IdP SAML est fiable pour assumer ce rôle à condition que l’audience SAML (`SAML:aud`) corresponde à `https://signin.aws.amazon.com/saml`.

## Nettoyage : supprimez les ressources
<a name="tutorial_saml-idp-and-federated-role-delete"></a>

Enfin, vous allez supprimer la pile et les ressources qu’elle contient.

1. Ouvrez la CloudFormation console.

1. Sur la page **Piles**, choisissez la pile créée à partir du modèle, choisissez **Supprimer**, puis confirmez **Supprimer**.

   CloudFormation initie la suppression de la pile et de toutes les ressources qu'elle contient.

## CloudFormation détails du modèle
<a name="tutorial_saml-idp-and-federated-role-template-details"></a>

### Ressources
<a name="tutorial_saml-idp-and-federated-role-template-resources"></a>

Le CloudFormation modèle de ce didacticiel créera les ressources suivantes dans votre compte :
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-samlprovider.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-samlprovider.html): un IdP SAML qui établit la confiance AWS entre et votre IdP externe.
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html) : un rôle IAM fédéré qui peut être endossé par les utilisateurs authentifiés via l’IdP SAML.

### Configuration
<a name="tutorial_saml-idp-and-federated-role-configuration"></a>

Le modèle comprend les paramètres configurables suivants :
+ **IdentityProviderName**- Nom de l'IdP SAML (laissez le champ vide pour le nom généré automatiquement)
+ **IdentityProviderSAMLMetadataDocument : document** de métadonnées SAML provenant de votre IdP (obligatoire)
+ **IdentityProviderAddPrivateKey**- Clé privée optionnelle pour déchiffrer les assertions SAML
+ **IdentityProviderAssertionEncryptionMode**- Mode de chiffrement pour les assertions SAML
+ **RoleName**- Nom du rôle IAM (laissez le champ vide pour le nom généré automatiquement)
+ **RolePath**- Chemin du rôle IAM (par défaut/)
+ **RolePermissionsBoundary**- ARN facultatif de la politique de limite des autorisations
+ **RoleSessionDuration**- Durée maximale de session en secondes (3600-43200, 7200 par défaut)
+ **RoleManagedPolicy1-5** - Possibilité ARNs de joindre jusqu'à 5 politiques gérées

## CloudFormation modèle
<a name="tutorial_saml-idp-and-federated-role-template"></a>

Enregistrez le code JSON ou YAML suivant dans un fichier distinct à utiliser comme CloudFormation modèle pour ce didacticiel.

------
#### [ JSON ]

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "[AWSDocs] IAM: tutorial_saml-idp-and-federated-role",
  "Parameters": {
    "IdentityProviderName": {
      "Type": "String",
      "Description": "Name of the SAML Identity Provider (leave empty for auto-generated name like '{StackName}-{UniqueId}')",
      "Default": "",
      "AllowedPattern": "^$|^[a-zA-Z0-9._-]+$",
      "ConstraintDescription": "Must be empty or contain only alphanumeric characters, periods, underscores, and hyphens"
    },
    "IdentityProviderSAMLMetadataDocument": {
      "Type": "String",
      "Description": "SAML metadata document from identity provider"
    },
    "IdentityProviderAddPrivateKey": {
      "Type": "String",
      "Description": "Optional private key for decrypting SAML assertions. The private key must be a .pem file that uses AES-GCM or AES-CBC encryption algorithm to decrypt SAML assertions.",
      "Default": ""
    },
    "IdentityProviderAssertionEncryptionMode": {
      "Type": "String",
      "Description": "Optional, sets encryption mode for SAML assertions",
      "Default": "",
      "AllowedValues": ["", "Allowed", "Required"]
    },
    "RoleName": {
      "Type": "String",
      "Description": "Name of the IAM Role (leave empty for auto-generated name like '{StackName}-{UniqueId}')",
      "Default": "",
      "AllowedPattern": "^$|^[\\w+=,.@-]{1,64}$",
      "ConstraintDescription": "Must be empty or 1-64 characters and can contain alphanumeric characters and +=,.@-"
    },
    "RolePath": {
      "Type": "String",
      "Description": "Path for the IAM Role",
      "AllowedPattern": "(^\\/$)|(^\\/.*\\/$)",
      "Default": "/"
    },
    "RolePermissionsBoundary": {
      "Type": "String",
      "Description": "Optional ARN of the permissions boundary policy (leave empty for none)",
      "Default": ""
    },
    "RoleSessionDuration": {
      "Description": "The maximum session duration (in seconds) that you want to set for the specified role (3600-43200)",
      "Type": "Number",
      "MinValue": 3600,
      "MaxValue": 43200,
      "Default": 7200
    },
    "RoleManagedPolicy1": {
      "Type": "String",
      "Description": "Optional managed policy ARN 1",
      "Default": ""
    },
    "RoleManagedPolicy2": {
      "Type": "String",
      "Description": "Optional managed policy ARN 2",
      "Default": ""
    },
    "RoleManagedPolicy3": {
      "Type": "String",
      "Description": "Optional managed policy ARN 3",
      "Default": ""
    },
    "RoleManagedPolicy4": {
      "Type": "String",
      "Description": "Optional managed policy ARN 4",
      "Default": ""
    },
    "RoleManagedPolicy5": {
      "Type": "String",
      "Description": "Optional managed policy ARN 5",
      "Default": ""
    }
  },
  "Conditions": {
    "HasCustomProviderName": {"Fn::Not": [{"Fn::Equals": [{"Ref": "IdentityProviderName"}, ""]}]},
    "HasCustomRoleName": {"Fn::Not": [{"Fn::Equals": [{"Ref": "RoleName"}, ""]}]},
    "HasPermissionsBoundary": {"Fn::Not": [{"Fn::Equals": [{"Ref": "RolePermissionsBoundary"}, ""]}]},
    "HasPolicy1": {"Fn::Not": [{"Fn::Equals": [{"Ref": "RoleManagedPolicy1"}, ""]}]},
    "HasPolicy2": {"Fn::Not": [{"Fn::Equals": [{"Ref": "RoleManagedPolicy2"}, ""]}]},
    "HasPolicy3": {"Fn::Not": [{"Fn::Equals": [{"Ref": "RoleManagedPolicy3"}, ""]}]},
    "HasPolicy4": {"Fn::Not": [{"Fn::Equals": [{"Ref": "RoleManagedPolicy4"}, ""]}]},
    "HasPolicy5": {"Fn::Not": [{"Fn::Equals": [{"Ref": "RoleManagedPolicy5"}, ""]}]},
    "HasPrivateKey": {"Fn::Not": [{"Fn::Equals": [{"Ref": "IdentityProviderAddPrivateKey"}, ""]}]},
    "HasAssertionEncryptionMode": {"Fn::Not": [{"Fn::Equals": [{"Ref": "IdentityProviderAssertionEncryptionMode"}, ""]}]}
  },
  "Resources": {
    "SAMLProvider": {
      "Type": "AWS::IAM::SAMLProvider",
      "Properties": {
        "Name": {"Fn::If": ["HasCustomProviderName", {"Ref": "IdentityProviderName"}, {"Ref": "AWS::NoValue"}]},
        "SamlMetadataDocument": {"Ref": "IdentityProviderSAMLMetadataDocument"},
        "AddPrivateKey": {"Fn::If": ["HasPrivateKey", {"Ref": "IdentityProviderAddPrivateKey"}, {"Ref": "AWS::NoValue"}]},
        "AssertionEncryptionMode": {"Fn::If": ["HasAssertionEncryptionMode", {"Ref": "IdentityProviderAssertionEncryptionMode"}, {"Ref": "AWS::NoValue"}]}
      }
    },
    "SAMLFederatedRole": {
      "Type": "AWS::IAM::Role",
      "Properties": {
        "RoleName": {"Fn::If": ["HasCustomRoleName", {"Ref": "RoleName"}, {"Ref": "AWS::NoValue"}]},
        "Path": {"Ref": "RolePath"},
        "Description": "SAML federated IAM role for SSO access with specified permissions",
        "MaxSessionDuration": {"Ref": "RoleSessionDuration"},
        "PermissionsBoundary": {"Fn::If": ["HasPermissionsBoundary", {"Ref": "RolePermissionsBoundary"}, {"Ref": "AWS::NoValue"}]},
        "AssumeRolePolicyDocument": {
          "Version": "2012-10-17",		 	 	 
          "Statement": [
            {
              "Effect": "Allow",
              "Principal": {
                "Federated": {"Ref": "SAMLProvider"}
              },
              "Action": [
                "sts:AssumeRole",
                "sts:SetSourceIdentity",
                "sts:TagSession"
              ],
              "Condition": {
                "StringEquals": {
                  "SAML:aud": "https://signin.aws.amazon.com/saml"
                }
              }
            }
          ]
        },
        "ManagedPolicyArns": {
          "Fn::Split": [
            ",",
            {
              "Fn::Join": [
                ",",
                [
                  {"Fn::If": ["HasPolicy1", {"Ref": "RoleManagedPolicy1"}, {"Ref": "AWS::NoValue"}]},
                  {"Fn::If": ["HasPolicy2", {"Ref": "RoleManagedPolicy2"}, {"Ref": "AWS::NoValue"}]},
                  {"Fn::If": ["HasPolicy3", {"Ref": "RoleManagedPolicy3"}, {"Ref": "AWS::NoValue"}]},
                  {"Fn::If": ["HasPolicy4", {"Ref": "RoleManagedPolicy4"}, {"Ref": "AWS::NoValue"}]},
                  {"Fn::If": ["HasPolicy5", {"Ref": "RoleManagedPolicy5"}, {"Ref": "AWS::NoValue"}]}
                ]
              ]
            }
          ]
        }
      }
    }
  },
  "Outputs": {
    "RoleARN": {
      "Description": "ARN of the created IAM Role",
      "Value": {"Fn::GetAtt": ["SAMLFederatedRole", "Arn"]},
      "Export": {
        "Name": {"Fn::Sub": "${AWS::StackName}-RoleARN"}
      }
    },
    "IdentityProviderARN": {
      "Description": "ARN of the created SAML Identity Provider",
      "Value": {"Ref": "SAMLProvider"},
      "Export": {
        "Name": {"Fn::Sub": "${AWS::StackName}-IdentityProviderARN"}
      }
    }
  }
}
```

------
#### [ YAML ]

```
AWSTemplateFormatVersion: '2010-09-09'
Description: '[AWSDocs] IAM: tutorial_saml-idp-and-federated-role'

Parameters:
  IdentityProviderName:
    Type: String
    Description: Name of the SAML Identity Provider (leave empty for auto-generated name like '{StackName}-{UniqueId}')
    Default: ""
    AllowedPattern: '^$|^[a-zA-Z0-9._-]+$'
    ConstraintDescription: Must be empty or contain only alphanumeric characters, periods, underscores, and hyphens

  IdentityProviderSAMLMetadataDocument:
    Type: String
    Description: SAML metadata document from identity provider

  IdentityProviderAddPrivateKey:
    Type: String
    Description: Optional private key for decrypting SAML assertions. The private key must be a .pem file that uses AES-GCM or AES-CBC encryption algorithm to decrypt SAML assertions.
    Default: ""

  IdentityProviderAssertionEncryptionMode:
    Type: String
    Description: Optional, sets encryption mode for SAML assertions
    Default: ""
    AllowedValues:
      - ""
      - "Allowed"
      - "Required"

  RoleName:
    Type: String
    Description: Name of the IAM Role (leave empty for auto-generated name like '{StackName}-{UniqueId}')
    Default: ""
    AllowedPattern: '^$|^[\w+=,.@-]{1,64}$'
    ConstraintDescription: "Must be empty or 1-64 characters and can contain alphanumeric characters and +=,.@-"

  RolePath:
    Type: String
    Description: Path for the IAM Role
    AllowedPattern: (^\/$)|(^\/.*\/$)
    Default: "/"

  RolePermissionsBoundary:
    Type: String
    Description: Optional ARN of the permissions boundary policy (leave empty for none)
    Default: ""
    
  RoleSessionDuration:
    Description: The maximum session duration (in seconds) that you want to set for the specified role (3600-43200)
    Type: Number
    MinValue: 3600
    MaxValue: 43200
    Default: 7200

  RoleManagedPolicy1:
    Type: String
    Description: Optional managed policy ARN 1
    Default: ""
  RoleManagedPolicy2:
    Type: String
    Description: Optional managed policy ARN 2
    Default: ""
  RoleManagedPolicy3:
    Type: String
    Description: Optional managed policy ARN 3
    Default: ""
  RoleManagedPolicy4:
    Type: String
    Description: Optional managed policy ARN 4
    Default: ""
  RoleManagedPolicy5:
    Type: String
    Description: Optional managed policy ARN 5
    Default: ""

Conditions:
  HasCustomProviderName: !Not [!Equals [!Ref IdentityProviderName, ""]]
  HasCustomRoleName: !Not [!Equals [!Ref RoleName, ""]]
  HasPermissionsBoundary: !Not [!Equals [!Ref RolePermissionsBoundary, ""]]
  HasPolicy1: !Not [!Equals [!Ref RoleManagedPolicy1, ""]]
  HasPolicy2: !Not [!Equals [!Ref RoleManagedPolicy2, ""]]
  HasPolicy3: !Not [!Equals [!Ref RoleManagedPolicy3, ""]]
  HasPolicy4: !Not [!Equals [!Ref RoleManagedPolicy4, ""]]
  HasPolicy5: !Not [!Equals [!Ref RoleManagedPolicy5, ""]]
  HasPrivateKey: !Not [!Equals [!Ref IdentityProviderAddPrivateKey, ""]]
  HasAssertionEncryptionMode: !Not [!Equals [!Ref IdentityProviderAssertionEncryptionMode, ""]]

Resources:
  SAMLProvider:
    Type: AWS::IAM::SAMLProvider
    Properties:
      Name: !If
        - HasCustomProviderName
        - !Ref IdentityProviderName
        - !Ref AWS::NoValue
      SamlMetadataDocument: !Ref IdentityProviderSAMLMetadataDocument
      AddPrivateKey: !If
        - HasPrivateKey
        - !Ref IdentityProviderAddPrivateKey
        - !Ref AWS::NoValue
      AssertionEncryptionMode: !If
        - HasAssertionEncryptionMode
        - !Ref IdentityProviderAssertionEncryptionMode
        - !Ref AWS::NoValue

  SAMLFederatedRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !If
        - HasCustomRoleName
        - !Ref RoleName
        - !Ref AWS::NoValue
      Path: !Ref RolePath
      Description: "SAML federated IAM role for SSO access with specified permissions"
      MaxSessionDuration: !Ref RoleSessionDuration
      PermissionsBoundary: !If
        - HasPermissionsBoundary
        - !Ref RolePermissionsBoundary
        - !Ref AWS::NoValue
      AssumeRolePolicyDocument:
        Version: '2012-10-17		 	 	 '
        Statement:
          - Effect: Allow
            Principal:
              Federated: !Ref SAMLProvider
            Action:
              - 'sts:AssumeRole'
              - 'sts:SetSourceIdentity'
              - 'sts:TagSession'
            Condition:
              StringEquals:
                'SAML:aud': 'https://signin.aws.amazon.com/saml'
      ManagedPolicyArns: !Split
        - ','
        - !Join
          - ','
          - - !If [HasPolicy1, !Ref RoleManagedPolicy1, !Ref "AWS::NoValue"]
            - !If [HasPolicy2, !Ref RoleManagedPolicy2, !Ref "AWS::NoValue"]
            - !If [HasPolicy3, !Ref RoleManagedPolicy3, !Ref "AWS::NoValue"]
            - !If [HasPolicy4, !Ref RoleManagedPolicy4, !Ref "AWS::NoValue"]
            - !If [HasPolicy5, !Ref RoleManagedPolicy5, !Ref "AWS::NoValue"]

Outputs:
  RoleARN:
    Description: ARN of the created IAM Role
    Value: !GetAtt SAMLFederatedRole.Arn
    Export:
      Name: !Sub '${AWS::StackName}-RoleARN'

  IdentityProviderARN:
    Description: ARN of the created SAML Identity Provider
    Value: !Ref SAMLProvider
    Export:
      Name: !Sub '${AWS::StackName}-IdentityProviderARN'
```

------