AWS Builder Center
One Entra tenant, two directories: SAML federation for an isolated Amazon WorkSpaces Applications environment

One Entra tenant, two directories: SAML federation for an isolated Amazon WorkSpaces Applications environment

This post shows how to give users access to an internet-isolated Amazon WorkSpaces Applications environment using their existing Microsoft Entra ID credentials. The isolated environment runs its own Active Directory, with no trust to production AD, no sync to Entra, and no internet connectivity. SAML 2.0 federation grants the streaming entitlement from the production identity, and a matching isolated-directory account completes the in-session Windows logon.

Introduction

Some workloads must run in a deliberately isolated environment: a VPC with no internet egress, its own Active Directory, and no connection back to your corporate production directory. Regulated or sovereign data, sensitive application hosting, and contractor segregation all push this way. Amazon WorkSpaces Applications (formerly AppStream 2.0) suits this well, streaming the applications into the isolated environment so the data never leaves it.
The friction is identity. The isolated environment runs its own directory, an AWS Managed Microsoft AD or a self-managed Active Directory on EC2, that is intentionally not synced to Microsoft Entra ID (formerly Azure AD) and has no trust to your production AD. Standing up a second identity stack, issuing every user a separate credential, and running MFA twice is exactly the overhead isolation was meant to avoid. Your users already have production Entra ID identities, with MFA and Conditional Access applied.
This post shows how to let those users sign in with their existing production Entra ID credentials and reach the isolated environment, with the isolated directory never synced to Entra, no trust between the directories, and no internet connectivity added. The mechanism is SAML 2.0 federation from your production Entra tenant to grant the streaming entitlement, paired with a single claim transformation that resolves each production identity to a matching isolated-directory account for the in-session Windows logon: two independent authentication layers bridged by one transformation. Sessions stream over DCV.
This post covers the identity and federation layer and assumes the isolated environment is already deployed: the VPC, the VPC endpoints, the directory, and a domain-joined fleet and stack. The Starting environment section recaps what the federation depends on.

Solution overview

Why this works: two independent authentication layers

The design rests on a property of domain-joined fleets: they authenticate the user in two independent layers, so the entitlement identity and the in-session identity can come from different directories that never have to know about each other.
  1. SAML to AWS, using the production Entra identity. Entra authenticates the user as their production identity (for example, jdoe@example.com) and federates to AWS. This is where your MFA and Conditional Access apply, and it grants the streaming entitlement. It is independent of the isolated directory.
  2. Windows logon to the streaming instance, using the isolated-directory identity. The streaming instance, domain-joined to the isolated directory (for example, euc.example.com), takes the SAML Name ID as the Windows username and prompts the user for that account's password.
Because the two layers are independent, the production directory and the isolated directory never need to be synced or trusted. The only thing that crosses between them is the Name ID, and the single requirement is that it names a real, enabled account in the isolated directory. A claim transformation in Entra maps the production identity to the matching isolated-directory account: the user signs in with their familiar production credentials in the browser, then enters a separate isolated-directory password at the in-session prompt. The username matches across both directories; the two passwords are independent and never synced. SAML 2.0 is also the only supported sign-in method for a domain-joined fleet, because such fleets do not support User Pool access, so this is the path whether or not the directories are separate.

The components

The federation spans three components that reference each other:
  • Microsoft Entra ID is the identity provider (IdP). It authenticates the production user and issues a signed SAML assertion.
  • AWS IAM is the trust anchor. It validates the assertion against an IAM SAML identity provider, maps the user to an IAM role, and issues temporary credentials.
  • Amazon WorkSpaces Applications is the service provider (SP). It receives the authenticated session and presents the user with their stack and applications in the isolated environment.
Because Entra needs the AWS role and provider ARNs, and AWS needs the Entra federation metadata, neither side completes in a single pass. The walkthrough resolves that cross-dependency: configure Entra far enough to export its metadata, build the AWS trust from it, then return to Entra to finish the claims.

How the sign-in flow works

In the IdP-initiated flow, the user starts from the Entra My Apps portal or a direct link:
  1. The user signs in to Entra ID with their production credentials and selects the WorkSpaces Applications tile.
  2. Entra ID issues a signed SAML assertion and posts it, with the relay state, to the AWS sign-in endpoint at https://signin.aws.amazon.com/saml.
  3. AWS validates the assertion against the IAM SAML identity provider, confirms the role mapping, and issues temporary credentials.
  4. The user is forwarded to the relay state URL, the portal for your stack, and the streaming session starts in the browser or the native client.
  5. Inside the session, the domain-joined instance completes the Windows logon against the isolated directory, using the Name ID as the username and prompting for the isolated-directory password.
Service-provider- and client-initiated flows use the same configuration: the client opens the system default browser, the user authenticates against Entra ID, and the session is handed back.

Starting environment

This post picks up from a deployed WorkSpaces Applications environment. The federation you configure here entitles users to stream from the stack that environment provides, so it helps to have the deployed resources in view. If your environment differs from the reference below, the federation steps still apply; only the directory and stack details change.
The reference environment is an internet-isolated (island) VPC: no internet gateway, no NAT, and all AWS service access over VPC endpoints. The resources assumed in place are:
Network and private connectivity
  • A VPC with no route to the internet, with directory and fleet subnets across two Availability Zones.
  • Interface VPC endpoints for the management plane: AWS Systems Manager (ssm, ssmmessages, ec2messages), EC2, and AWS Directory Service (ds), each with Private DNS enabled, plus an S3 gateway endpoint on all route tables.
  • An interface VPC endpoint for the WorkSpaces Applications streaming service (com.amazonaws.<region>.appstream.streaming) with Private DNS enabled and associated with the stack, so the streaming data plane stays inside the VPC. Optionally, an appstream.api endpoint for private management calls.
Directory
  • A directory that provides identity for the fleet, either an AWS Managed Microsoft AD or a self-managed Active Directory on EC2. Both are supported and the choice does not change the federation configuration; it changes only where the accounts live and who operates the domain controllers (AWS with Managed AD, you with a self-managed AD on EC2).
  • DNS resolution set through a DHCP option set (or a Route 53 Resolver rule) that points the fleet subnets at the directory's DNS, which forwards AWS service names back to the VPC resolver so the private endpoints keep resolving.
  • A delegated OU that receives the fleet's computer objects, and a service account with the minimum rights to create and manage those objects.
WorkSpaces Applications
  • A directory configuration pointing at the directory, with the target OU distinguished name and the service account.
  • A domain-joined fleet (On-Demand or Always-On), joined at launch into the delegated OU, with Default Internet Access disabled. It runs streaming and service management over an AWS-managed interface rather than your subnet, so it operates correctly in an isolated VPC with no NAT. Both fleet types domain-join and federate identically, so the rest of this post just says the fleet. Elastic fleets are not domain-joined and are out of scope.
  • A stack associated with the fleet, with the streaming endpoint associated to it, and scaling policies that maintain a buffer of idle instances.
Two facts from this environment flow directly into the federation design.
  • The fleet is domain-joined, so SAML 2.0 is mandatory. Domain-joined fleets do not support User Pool access, so SAML is the only option, not one among several.
  • Private streaming does not remove the sign-in dependency. The streaming endpoint privatises the session, but the user's device still reaches Microsoft Entra ID and the WorkSpaces Applications user-authentication domains to sign in. For an internal-only deployment, route the user network to the streaming endpoint over a VPN or AWS Direct Connect, and allow the Entra and user-authentication domains plus the endpoint's own FQDN, <vpc-endpoint-id>.streaming.appstream.<region>.vpce.amazonaws.com. Once the endpoint is set on the stack, that name replaces the public *.amazonappstream.com dependency. The federation in this post is exactly that sign-in path.

Prerequisites

Complete the items in this section before you begin. Missing prerequisites are the most common cause of failed federation.
Microsoft Entra ID
  • An active Entra ID tenant whose identities will access WorkSpaces Applications.
  • The Cloud Application Administrator or Application Administrator role, to create and configure the enterprise application and its single sign-on settings.
  • Entra ID P1 or higher if you intend to assign the application to a security group. Assigning individual users works on all tiers.
  • A populated identity source attribute on each user. The SAML Name ID is derived from an attribute such as user.userprincipalname or user.mail; an empty source attribute is a frequent cause of authentication failures.
AWS
  • An AWS account with permission to create SAML identity providers, IAM policies, and IAM roles.
  • An existing WorkSpaces Applications stack, with an associated fleet and image. The stack must exist before you create the IAM policy, because the policy scopes to the stack ARN. The stack name is case-sensitive.
  • Region consistency. The relay state endpoint Region, the stack Region, and the IAM policy resource ARN Region must all match.
Identities in the isolated directory
Each production user who streams must have a matching account in the isolated directory, enabled and with its own password (separate from their production password), because the streaming instance authenticates the Windows logon against it. Name each isolated-directory account with the same sAMAccountName as the production user, so the Name ID transformation in Phase 3 resolves to it. The full requirement, including the two-password implications, is in the section on mapping the production identity to the isolated directory.

Values used in this post

The walkthrough uses the values below. The Set by column shows which are yours to choose, which come from your environment, which are derived, and which are fixed by AWS or Entra and must be entered exactly as shown. Where you choose a name, the value here is only an example; use whatever you like, but use it consistently, because the name flows into the ARNs and claims that reference it. The account ID 111122223333 is a documentation placeholder.
ItemValue in this postSet by
AWS account ID111122223333Your environment
AWS Region<region> (must match your stack's Region)Your environment
Stack name (case-sensitive)<stack-name>Your environment
SAML provider nameEntraSSOYour choice
IAM role nameWSA-EntraSSO-RoleYour choice
IAM policy nameWSA-StreamYour choice
Enterprise application nameWorkSpaces ApplicationsYour choice
SAML provider ARNarn:aws:iam::111122223333:saml-provider/EntraSSODerived (follows the provider name)
IAM role ARNarn:aws:iam::111122223333:role/WSA-EntraSSO-RoleDerived (follows the role name)
Stack resource ARNarn:aws:appstream:<region>:111122223333:stack/<stack-name>Derived (follows the stack name)
Entity ID (Identifier)urn:amazon:webservicesFixed by AWS
Reply URL (ACS)https://signin.aws.amazon.com/samlFixed by AWS
Claim namespacehttps://aws.amazon.com/SAML/AttributesFixed by AWS
Relay state endpointhttps://appstream2.euc-sso.<region>.aws.amazon.com/samlFixed format, Region-specific
Relay state URL (constructed)https://appstream2.euc-sso.<region>.aws.amazon.com/saml?accountId=111122223333&stack=<stack-name>Derived
The relay state endpoint is Region-specific, in the form https://appstream2.euc-sso.<region>.aws.amazon.com/saml. For example, Singapore uses ap-southeast-1, N. Virginia uses us-east-1, and Ireland uses eu-west-1. The full list is in Setting up SAML  in the WorkSpaces Applications Administration Guide. For FIPS-compliant streaming, use the FIPS variant of the endpoint where available.

Build order

The sequence below resolves the cross-dependency between Entra and AWS:
  1. Phase 1 (Entra): Create the enterprise application, complete the Basic SAML configuration, then export the federation metadata. The metadata download stays disabled until the configuration is set, so this order matters.
  2. Phase 2 (AWS): Create the IAM SAML identity provider from that metadata, then the IAM role with an inline streaming policy. Capture the provider and role ARNs.
  3. Phase 3 (Entra): Return to Entra to configure the claims with those ARNs, then assign users or groups.
  4. Phase 4: Validate the end-to-end sign-in.

Phase 1: Create the Entra enterprise application and export metadata

Perform these steps in the Microsoft Entra admin center, in order. The metadata cannot be exported until the Basic SAML configuration is set.

Create the application

  1. In the navigation pane, choose Enterprise applications, then + New application.
  2. On the Browse Microsoft Entra Gallery page, choose + Create your own application.
  3. Name the application (for example, WorkSpaces Applications), select Integrate any other application you don't find in the gallery (Non-gallery), then choose Create.
  4. When the application has been created, under Manage, choose Single sign-on, then select SAML.

Set the Basic SAML configuration

Edit the Basic SAML Configuration section and set the following, then choose Save.
FieldValue
Identifier (Entity ID)urn:amazon:webservices
Reply URL (Assertion Consumer Service URL)https://signin.aws.amazon.com/saml
Sign on URL(leave blank)
Relay Statehttps://appstream2.euc-sso.<region>.aws.amazon.com/saml?accountId=111122223333&stack=<stack-name>
A note on the Entity ID. Entra requires a unique Entity ID per application. If urn:amazon:webservices is already used in your tenant, Entra appends a numeral, for example urn:amazon:webservices2. AWS accepts these numbered variants and has no matching Entity ID setting on its side, so keep whichever value Entra shows; the only rule is that each enterprise application has a unique Entity ID.

Export the federation metadata

A newly created enterprise application already has an Active token-signing certificate; use it. Do not create a new one; the New Certificate button is only for rollover.
  1. In the SAML Certificates section, the Certificate (Base64), Certificate (Raw), and Federation Metadata XML download links are now active (greyed out until the Basic SAML configuration is set).
  2. Download the Federation Metadata XML and save it somewhere you can reach from the AWS IAM console.
The App Federation Metadata Url on the same panel serves the same XML live, but AWS IAM requires the metadata document, not a URL; if you prefer the URL, fetch the XML from it and upload that file in Phase 2. The metadata embeds whichever signing certificate is Active at export, so if you later rotate the certificate, re-export and re-upload it to the IAM SAML provider, or the trust breaks.
Leave this browser tab open. You return to it in Phase 3.

Phase 2: Configure AWS IAM

Perform these steps in the AWS IAM console.

Create the SAML identity provider

  1. In the IAM console, choose Identity providers, then Add provider.
  2. For Provider type, choose SAML.
  3. For Provider name, enter a name of your choosing. This post uses EntraSSO. It becomes part of the provider ARN, so use it consistently from here on.
  4. Under Metadata document, choose Choose file and upload the Federation Metadata XML from Phase 1.
  5. Choose Add provider.
  6. Open the provider and copy its ARN. With the name above it reads:
1
arn:aws:iam::111122223333:saml-provider/EntraSSO

Create the IAM role

The role both establishes the trust with Entra and grants the streaming permission. The SAML federation wizard only attaches existing managed policies, so create the role without a permissions policy, then add the streaming permission as an inline policy. An inline policy keeps the stack permission bound to this role and leaves nothing behind if the role is deleted.
  1. In the IAM console, choose Roles, then Create role.
  2. For the trusted entity type, choose SAML 2.0 federation.
  3. Under SAML 2.0-based provider, choose the SAML provider you created (EntraSSO in this post). Leave the optional Condition section blank; the trust condition is set explicitly when you edit the trust policy.
  4. Choose Next. Do not attach a permissions policy at this step, then choose Next again.
  5. Name the role. This post uses WSA-EntraSSO-Role. The name becomes part of the role ARN referenced in the Entra Role claim, so use it consistently. Choose Create role.
  6. Set the trust policy. Open the role, choose Trust relationships, then Edit trust policy, and set it to:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::111122223333:saml-provider/EntraSSO"
},
"Action": "sts:AssumeRoleWithSAML",
"Condition": {
"StringEquals": {
"SAML:sub_type": "persistent"
}
}
}
]
}
This guide uses the SAML:sub_type: persistent condition, which pairs with the Persistent Name ID format set in Phase 3. The published AWS Entra blog  uses a SAML:aud condition set to https://signin.aws.amazon.com/saml instead; both are valid. If you plan to use session context, attribute-based application entitlements, or certificate-based authentication, add sts:TagSession to the Action array alongside sts:AssumeRoleWithSAML.
7. Add the inline streaming policy. Still on the role, choose Permissions, Add permissions, then Create inline policy. Choose the JSON tab and paste the following. This grants federated users permission to stream from your stack, and only your stack:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "appstream:Stream",
"Resource": "arn:aws:appstream:<region>:111122223333:stack/<stack-name>",
"Condition": {
"StringEquals": {
"appstream:userId": "${saml:sub}"
}
}
}
]
}
The Resource ARN Region and stack name must match your stack exactly. The stack name is case-sensitive.
8. Choose Next, name the policy (this post uses WSA-Stream), and choose Create policy.
9. Copy the Role ARN:
1
arn:aws:iam::111122223333:role/WSA-EntraSSO-Role
You now have both ARNs needed for Phase 3: the provider ARN and the role ARN.

Phase 3: Configure the Entra claims and assignment

Return to the enterprise application in the Entra admin center, under Manage, Single sign-on.

Set the Name ID claim

Edit the Attributes & Claims section. Under Required claim, set the Unique User Identifier (Name ID).
The Name ID must become the isolated-directory identity, not the production identity, because the streaming instance uses it as the Windows username and the production identity does not exist in the isolated directory. The default user.userprincipalname mapping emits the production identity and the Windows logon fails. The next section, "Map the production identity to the isolated directory account," sets this claim through a transformation; configure it there, then continue with the remaining claims below. (If the isolated directory were synced to Entra or matched natively, you could map the Name ID straight to user.userprincipalname with the format set to Persistent, but that is not the case here.)

Remove the default claims

Entra adds several default claims that AWS does not use. Delete each of the default additional claims (givenname, surname, emailaddress, name) using the three-dot menu.

Add the AWS claims

Choose + Add new claim and create the following three claims. The namespace for all of them is https://aws.amazon.com/SAML/Attributes.
Claim nameSourceSource attribute or value
RoleAttributearn:aws:iam::111122223333:role/WSA-EntraSSO-Role,arn:aws:iam::111122223333:saml-provider/EntraSSO
RoleSessionNameAttributeuser.userprincipalname
SessionDurationAttribute3600
  • The Role value is the role ARN, then a comma, then the provider ARN, with no spaces.
  • RoleSessionName must be 2 to 64 characters, alphanumeric plus + = , . @ -, with no spaces. Mapping it to user.userprincipalname gives each user a unique session name for AWS traceability. A static string is permitted, but a per-user attribute is preferred.
  • SessionDuration is in seconds, between 900 (15 minutes) and 43200 (12 hours). If omitted, the session defaults to 60 minutes.

Assign users and groups

  1. On the enterprise application menu, choose Manage, then Users and groups.
  2. Choose + Add user/group, select the users or groups that should have access, then choose Assign.
Group-based assignment requires Entra ID P1 or higher. On lower tiers, assign individual users.
Optionally, under Properties, upload a logo and note the User access URL, which reaches the stack directly.

Map the production identity to the isolated directory account

This step lets a production Entra identity sign in to an isolated environment whose directory is separate, unsynced, and untrusted. The streaming instance authenticates the Windows logon against the isolated directory using the SAML Name ID as the username, so the Name ID must resolve to a real, enabled account there, not the production identity. The transformation derives that account from the synced sAMAccountName, so the production and isolated-directory usernames must match. The user signs in to Entra with their production credentials and supplies the isolated-directory password at the in-session prompt; no trust is required, because that credential is supplied directly.

Transform the Name ID to the isolated directory UPN

In the enterprise application, under Single sign-on, Attributes & Claims, edit the Unique User Identifier (Name ID) claim, set Source to Transformation, then configure:
FieldValue
TransformationRegexReplace()
Parameter 1Attribute
Attribute nameuser.onpremisessamaccountname
Regex pattern(?'sam'^.*$)
Replacement pattern{sam}@euc.example.com
Name identifier formatPersistent
Use the Test transformation box: enter a sample sAMAccountName (jdoe) and confirm the output is jdoe@euc.example.com before choosing Add.
RegexReplace() emits the literal value you specify, so the directory UPN comes through intact rather than as a per-application pairwise identifier. This works cleanly because user@euc.example.com is the native default UPN of an account created in the euc.example.com directory; no alternate UPN suffix is required.

Create the matching directory accounts and the two passwords

For each production user who will stream, create an account in the isolated directory with a sAMAccountName that exactly matches the production username. Because the isolated directory's DNS domain is euc.example.com, each account automatically carries the userPrincipalName user@euc.example.com, which is what the Name ID resolves to. So if the production user is jdoe, create jdoe in the isolated directory, and the Name ID jdoe@euc.example.com lands on it.
Set a password on each account, confirm it is enabled, and do not set "user must change password at next logon," which stalls the streaming logon. Communicate each user's isolated-directory password through your normal secure channel.
Each user therefore has two passwords. The username is the same in both directories, but the passwords are independent and are never synced:
  • Their production Entra password, entered in the browser when Entra authenticates the federation. This is where MFA and Conditional Access apply.
  • Their separate isolated-directory password, entered at the in-session Windows logon prompt.
Because there is no sync and no trust, you set, communicate, rotate, and reset the isolated-directory passwords yourself, independently of production: a production password change or self-service reset does not reach the isolated directory, and expiry and complexity are governed by the isolated directory's own Group Policy. Set user expectations accordingly, because entering a second, different password at the in-session prompt is the part most likely to surprise them.

Considerations for the split-domain pattern

  • Username matches, passwords do not. The sAMAccountName is identical in both directories, which is what makes the Name ID resolve, but the production and isolated-directory passwords are separate and managed independently. See "Create the matching directory accounts and the two passwords."
  • Keep RoleSessionName clean. Source RoleSessionName from user.userprincipalname, not the transformed Name ID, so AWS traceability carries the production identity.
  • onPremisesSamAccountName is only populated for synced users. It flows for accounts synced from on-premises AD via Entra Connect; cloud-only users would not have it.
  • Mind the 20-character sAMAccountName limit. If a production username exceeds it, the match breaks.
  • No interactive logon banner on the streaming OU. A logon banner (legal notice) GPO blocks the service from completing the Windows logon and produces a repeating password prompt, the most common cause of that symptom on domain-joined fleets.
  • Group Policy is your responsibility in the separate directory. The isolated directory has its own Group Policy. Production policies (security baselines, hardening, screen-lock, audit) do not carry across on their own, even where a trust exists, because a trust authenticates principals but does not replicate Group Policy. Recreate and maintain the required GPOs in the isolated directory from a domain-joined management instance.
  • Network line of sight. The fleet VPC must reach the isolated directory's domain controllers for the Windows logon, with the AD ports open: DNS (53), Kerberos (88), LDAP (389 and 636), SMB (445), and the RPC range. The fleet subnets must resolve the directory's DNS, set through a DHCP option set or a Route 53 Resolver rule.
  • Profiles and shared resources live on the isolated directory side. Without a trust, the session identity cannot authenticate to production file shares, SQL Server using Windows authentication, licensing servers, or printers. Use home folders or FSLogix backed by storage joined to the isolated directory.
  • Conditional Access still applies at sign-in. The SAML authentication runs in the browser against the production identity, so confirm no device-compliance or IP-based policy traps your test accounts.
  • Certificate-based authentication maps cleanly later. If you move to passwordless sign-in, the isolated directory is the account's real domain, so add the PrincipalTag:ObjectSid claim and the sts:TagSession trust permission.

Validate before you rely on it

Capture the SAML response on a test login with a browser SAML tracer and confirm the Name ID reads user@euc.example.com (the persistent UPN), not a GUID-like pairwise value. A GUID-like value means the transformation is not being applied: recheck the RegexReplace() configuration and the Test transformation output. This behaviour is tenant-specific, so re-run the check in your own environment.

Phase 4: Validate the integration

Run the sign-in

  1. Open a new private or incognito browser window.
  2. Browse to the User access URL, or sign in to the Entra My Apps portal and select the WorkSpaces Applications tile.
  3. Authenticate as a user assigned to the application, using their production Entra credentials. MFA and Conditional Access apply at this step.
  4. You are redirected to the WorkSpaces Applications sign-in page, where you choose Continue with Browser or Open WorkSpaces Applications client.
  5. When the session opens, enter the user's isolated-directory password at the in-session Windows logon prompt: the second, separate password, not the production one.
  6. Confirm the streaming session starts and your assigned applications are available.
To force a specific client and skip the chooser, append &client=native or &client=web to the relay state URL. This is supported on the recommended Regional endpoints and client version 1.1.1300 and later.

What a correct SAML assertion looks like

Decode the SAML response with a browser SAML tracer. A correct assertion looks like the following, with the signature block and automatic Microsoft claims abbreviated:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<samlp:Response Destination="https://signin.aws.amazon.com/saml" ...>
<Issuer>https://sts.windows.net/<entra-tenant-id>/</Issuer>
<samlp:Status>
<samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/>
</samlp:Status>
<Assertion ...>
<Issuer>https://sts.windows.net/<entra-tenant-id>/</Issuer>
<Signature>...</Signature>
<Subject>
<NameID Format="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent">jdoe@euc.example.com</NameID>
<SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
<SubjectConfirmationData Recipient="https://signin.aws.amazon.com/saml" NotOnOrAfter="..."/>
</SubjectConfirmation>
</Subject>
<Conditions NotBefore="..." NotOnOrAfter="...">
<AudienceRestriction>
<Audience>urn:amazon:webservices</Audience>
</AudienceRestriction>
</Conditions>
<AttributeStatement>
<Attribute Name="https://aws.amazon.com/SAML/Attributes/Role">
<AttributeValue>arn:aws:iam::111122223333:role/WSA-EntraSSO-Role,arn:aws:iam::111122223333:saml-provider/EntraSSO</AttributeValue>
</Attribute>
<Attribute Name="https://aws.amazon.com/SAML/Attributes/RoleSessionName">
<AttributeValue>jdoe@example.com</AttributeValue>
</Attribute>
<Attribute Name="https://aws.amazon.com/SAML/Attributes/SessionDuration">
<AttributeValue>3600</AttributeValue>
</Attribute>
</AttributeStatement>
</Assertion>
</samlp:Response>
Check each of these:
  • NameID is the persistent UPN that exists in the isolated directory (jdoe@euc.example.com), not a GUID-like pairwise identifier. It becomes the Windows username in the session.
  • RoleSessionName is the production identity (jdoe@example.com), kept separate from the NameID for AWS traceability.
  • Role is the role ARN, a comma, then the provider ARN, with no spaces.
  • Audience matches the Entity ID from Phase 1 (urn:amazon:webservices, or your numbered variant).
  • Recipient and Destination are https://signin.aws.amazon.com/saml.
  • SessionDuration is 3600 (one hour), and the Status is Success with the Assertion signed by the Active token-signing certificate.
The automatic Microsoft claims (tenantid, objectidentifier, identityprovider, authnmethodsreferences) are emitted by Entra and ignored by AWS; you do not need to remove them.

Clean up

To remove the federation without affecting the fleet and stack: delete the enterprise application in the Entra admin center, then the IAM role and SAML identity provider you created (WSA-EntraSSO-Role and EntraSSO). The fleet, stack, and directory are managed separately.

Conclusion

You enabled users to sign in to an isolated Amazon WorkSpaces Applications environment with their existing production Microsoft Entra ID credentials, while the isolated directory stays unsynced, untrusted, and without internet connectivity. Entra federates the production identity to AWS over SAML 2.0 to grant the streaming entitlement, where your MFA and Conditional Access apply, and a single Name ID transformation resolves that identity to a matching isolated-directory account for the in-session Windows logon. The two layers stay independent, so neither directory has to know about the other, and the phased build resolves the Entra-to-AWS cross-dependency cleanly: prepare Entra, build the AWS trust, finish the Entra claims, then validate.
From here, you can extend the design with attribute-based application entitlements across multiple stacks, session context, or certificate-based authentication for passwordless sign-in, each adding sts:TagSession to the role trust policy and one or more attribute claims.
Any opinions in this article are those of the individual author and may not reflect the opinions of AWS.
Enjoyed reading this content? Let the author know!

Your likes, comments, shares, and saves help creators reach more builders.

Loading recommendations

Loading article