Skip to content

Commit 7622306

Browse files
authored
Added support for multi-tenant Entra ID apps. (#2848)
1 parent 1d1aed2 commit 7622306

File tree

6 files changed

+27
-12
lines changed

6 files changed

+27
-12
lines changed

src/components/users/signin-social/react/runtime/SignInAadRuntime.tsx

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,23 @@ import { BtnSpinner } from "../../../../utils/react/BtnSpinner";
1313

1414
type SignInAadRuntimeProps = {
1515
label: string
16+
tenants: string[],
1617
replyUrl: string,
1718
classNames: string
1819
}
1920
type SignInAadRuntimeFCProps = SignInAadRuntimeProps & {
20-
signIn: () => Promise<void>
21+
signIn: (selectedTenant: string) => Promise<void>
2122
};
2223

23-
const SignInAadRuntimeFC = ({ label, signIn, classNames }: SignInAadRuntimeFCProps) => {
24+
const SignInAadRuntimeFC = ({ label, signIn, tenants, classNames }: SignInAadRuntimeFCProps) => {
2425
return (
25-
<BtnSpinner onClick={signIn} className={classNames}>
26-
<i className="icon-emb icon-svg-entraId"></i>
27-
{label}
28-
</BtnSpinner>
26+
<div className="flex flex-wrap">
27+
{tenants.map(tenant => (
28+
<BtnSpinner key={tenant} onClick={()=>signIn(tenant)} className={classNames}>
29+
<i className="icon-emb icon-svg-entraId"></i>
30+
{tenants.length > 1 ? `${label} (${tenant.replace('.onmicrosoft.com', '')})`: label }
31+
</BtnSpinner>))}
32+
</div>
2933
);
3034
};
3135

@@ -48,23 +52,24 @@ export class SignInAadRuntime extends React.Component<SignInAadRuntimeProps> {
4852
private selectedService: IAadService;
4953
private aadConfig: AadClientConfig;
5054

51-
public async signIn(): Promise<void> {
55+
public async signIn(selectedTenant: string): Promise<void> {
5256
dispatchErrors(this.eventManager, ErrorSources.signInOAuth, []);
5357
this.logger.trackEvent(eventTypes.aadLogin, { message: "Initiating AAD login" });
5458

5559
try {
5660
this.aadConfig = await this.settingsProvider.getSetting<AadClientConfig>(SettingNames.aadClientConfig);
5761

58-
if (this.aadConfig ) {
59-
if (this.aadConfig .clientLibrary === AadClientLibrary.v2) {
62+
if (this.aadConfig) {
63+
if (this.aadConfig.clientLibrary === AadClientLibrary.v2) {
6064
this.selectedService = this.aadServiceV2;
6165
}
6266
else {
6367
this.selectedService = this.aadService;
6468
}
6569

66-
await this.selectedService.signInWithAad(this.aadConfig .clientId, this.aadConfig .authority, this.aadConfig .signinTenant || defaultAadTenantName, this.props.replyUrl);
67-
} else {
70+
await this.selectedService.signInWithAad(this.aadConfig.clientId, this.aadConfig.authority, selectedTenant, this.props.replyUrl);
71+
}
72+
else {
6873
this.logger.trackEvent(eventTypes.aadLogin, { message: "AAD client config is not set" });
6974
}
7075
} catch (error) {

src/components/users/signin-social/signinSocialViewModelBinder.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,13 @@ export class SigninSocialViewModelBinder implements ViewModelBinder<SigninSocial
5353
const termsOfService = await this.getTermsOfService();
5454
const termsOfUse = (termsOfService.text && termsOfService.enabled) ? termsOfService.text : undefined;
5555

56+
const tenants = aadIdentityProvider.allowedTenants || [];
57+
5658
if (aadIdentityProvider) {
5759
state.aadConfig = {
5860
classNames: classNames,
5961
label: model.aadLabel,
62+
tenants: tenants,
6063
replyUrl: model.aadReplyUrl || undefined,
6164
termsOfUse: aadB2CIdentityProvider ? undefined : termsOfUse // display terms of use only once if both configs are present
6265
};

src/contracts/aadB2CClientConfig.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { AadClientConfig } from "./aadClientConfig";
22

3-
export interface AadB2CClientConfig extends AadClientConfig{
3+
export interface AadB2CClientConfig extends AadClientConfig {
44
/**
55
* Sign-in policy name. Only applies to AAD B2C identity provider.
66
*/

src/contracts/aadClientConfig.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ export interface AadClientConfig {
1717
*/
1818
signinTenant: string;
1919

20+
/**
21+
* The list of allowed tenants for multi-tenant applications.
22+
*/
23+
allowedTenants?: string[];
24+
2025
/**
2126
* The client library to be used in the developer portal
2227
*/

src/publishing/aadConfigPublisher.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ export class AadConfigPublisher implements IPublisher {
2525
clientId: aadIdentityProvider.clientId,
2626
authority: aadIdentityProvider.authority,
2727
signinTenant: aadIdentityProvider.signinTenant,
28+
allowedTenants: aadIdentityProvider.allowedTenants,
2829
clientLibrary: aadIdentityProvider.clientLibrary
2930
};
3031

src/services/runtimeConfigurator.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ export class RuntimeConfigurator {
3636
clientId: aadIdentityProvider.clientId,
3737
authority: aadIdentityProvider.authority,
3838
signinTenant: aadIdentityProvider.signinTenant,
39+
allowedTenants: aadIdentityProvider.allowedTenants,
3940
clientLibrary: aadIdentityProvider.clientLibrary
4041
};
4142

0 commit comments

Comments
 (0)