@@ -31,18 +31,28 @@ namespace Microsoft.Identity.Test.Integration.HeadlessTests
31
31
public class ConfidentialClientIntegrationTests
32
32
{
33
33
private static readonly string [ ] s_scopes = { "User.Read" } ;
34
- private static readonly string [ ] s_oboServiceScope = { "api://23c64cd8-21e4-41dd-9756-ab9e2c23f58c/access_as_user" } ;
34
+ private static readonly string [ ] s_publicCloudOBOServiceScope = { "api://23c64cd8-21e4-41dd-9756-ab9e2c23f58c/access_as_user" } ;
35
+ private static readonly string [ ] s_arlingtonOBOServiceScope = { "https://arlmsidlab1.us/IDLABS_APP_Confidential_Client/user_impersonation" } ;
35
36
private static readonly string [ ] s_keyvaultScope = { "https://vault.azure.net/.default" } ;
36
37
private static readonly string [ ] s_adfsScopes = { "openid" , "profile" } ;
37
38
38
39
//TODO: acquire scenario specific client ids from the lab resonse
39
- private const string ConfidentialClientID = "16dab2ba-145d-4b1b-8569-bf4b9aed4dc8" ;
40
+ private const string PublicCloudPublicClientIDOBO = "be9b0186-7dfd-448a-a944-f771029105bf" ;
41
+ private const string PublicCloudConfidentialClientIDOBO = "23c64cd8-21e4-41dd-9756-ab9e2c23f58c" ;
42
+ private const string PublicCloudConfidentialClientID = "16dab2ba-145d-4b1b-8569-bf4b9aed4dc8" ;
43
+ private const string ArlingtonConfidentialClientIDOBO = "c0555d2d-02f2-4838-802e-3463422e571d" ;
44
+ private const string ArlingtonPublicClientIDOBO = "cb7faed4-b8c0-49ee-b421-f5ed16894c83" ;
45
+ private const string ArlingtonAuthority = "https://login.microsoftonline.us/45ff0c17-f8b5-489b-b7fd-2fedebbec0c4" ;
46
+
47
+ private const string PublicCloudHost = "https://login.microsoftonline.com/" ;
48
+ private const string ArlingtonCloudHost = "https://login.microsoftonline.us/" ;
40
49
41
50
private const string RedirectUri = "https://login.microsoftonline.com/common/oauth2/nativeclient" ;
42
- private const string TestAuthority = "https://login.windows.net/72f988bf-86f1-41af-91ab-2d7cd011db47" ;
51
+ private const string PublicCloudTestAuthority = "https://login.windows.net/72f988bf-86f1-41af-91ab-2d7cd011db47" ;
43
52
private const string AdfsCertName = "IDLABS-APP-Confidential-Client-Cert-OnPrem" ;
44
53
private KeyVaultSecretsProvider _keyVault ;
45
- private string _ccaSecret ;
54
+ private static string _publicCloudCcaSecret ;
55
+ private static string _arlingtonCCASecret ;
46
56
47
57
[ ClassInitialize ]
48
58
public static void ClassInitialize ( TestContext context )
@@ -58,7 +68,8 @@ public void TestInitialize()
58
68
if ( _keyVault == null )
59
69
{
60
70
_keyVault = new KeyVaultSecretsProvider ( ) ;
61
- _ccaSecret = _keyVault . GetSecret ( TestConstants . MsalCCAKeyVaultUri ) . Value ;
71
+ _publicCloudCcaSecret = _keyVault . GetSecret ( TestConstants . MsalCCAKeyVaultUri ) . Value ;
72
+ _arlingtonCCASecret = _keyVault . GetSecret ( TestConstants . MsalArlingtonCCAKeyVaultUri ) . Value ;
62
73
}
63
74
}
64
75
@@ -67,7 +78,7 @@ public void TestInitialize()
67
78
public async Task GetAuthorizationRequestUrl_ReturnsUri_Async ( )
68
79
{
69
80
var cca = ConfidentialClientApplicationBuilder
70
- . Create ( ConfidentialClientID )
81
+ . Create ( PublicCloudConfidentialClientID )
71
82
. WithRedirectUri ( RedirectUri )
72
83
. Build ( ) ;
73
84
@@ -82,7 +93,7 @@ public async Task GetAuthorizationRequestUrl_ReturnsUri_Async()
82
93
83
94
CoreAssert . AreEqual ( "offline_access openid profile User.Read" , uriParams1 [ "scope" ] , uriParams2 [ "scope" ] ) ;
84
95
CoreAssert . AreEqual ( "code" , uriParams1 [ "response_type" ] , uriParams2 [ "response_type" ] ) ;
85
- CoreAssert . AreEqual ( ConfidentialClientID , uriParams1 [ "client_id" ] , uriParams2 [ "client_id" ] ) ;
96
+ CoreAssert . AreEqual ( PublicCloudConfidentialClientID , uriParams1 [ "client_id" ] , uriParams2 [ "client_id" ] ) ;
86
97
CoreAssert . AreEqual ( RedirectUri , uriParams1 [ "redirect_uri" ] , uriParams2 [ "redirect_uri" ] ) ;
87
98
CoreAssert . AreEqual ( "select_account" , uriParams1 [ "prompt" ] , uriParams2 [ "prompt" ] ) ;
88
99
@@ -98,10 +109,10 @@ public async Task ConfidentialClientWithCertificateTestAsync()
98
109
AuthenticationResult authResult ;
99
110
IConfidentialClientApplication confidentialApp ;
100
111
X509Certificate2 cert = GetCertificate ( ) ;
101
- var confidentialClientAuthority = TestAuthority ;
112
+ var confidentialClientAuthority = PublicCloudTestAuthority ;
102
113
103
114
confidentialApp = ConfidentialClientApplicationBuilder
104
- . Create ( ConfidentialClientID )
115
+ . Create ( PublicCloudConfidentialClientID )
105
116
. WithAuthority ( new Uri ( confidentialClientAuthority ) , true )
106
117
. WithCertificate ( cert )
107
118
. Build ( ) ;
@@ -134,10 +145,10 @@ public async Task ConfidentialClientWithRSACertificateTestAsync()
134
145
AuthenticationResult authResult ;
135
146
IConfidentialClientApplication confidentialApp ;
136
147
X509Certificate2 cert = GetCertificate ( true ) ;
137
- var confidentialClientAuthority = TestAuthority ;
148
+ var confidentialClientAuthority = PublicCloudTestAuthority ;
138
149
139
150
confidentialApp = ConfidentialClientApplicationBuilder
140
- . Create ( ConfidentialClientID )
151
+ . Create ( PublicCloudConfidentialClientID )
141
152
. WithAuthority ( new Uri ( confidentialClientAuthority ) , true )
142
153
. WithCertificate ( cert )
143
154
. Build ( ) ;
@@ -166,12 +177,27 @@ public async Task ConfidentialClientWithRSACertificateTestAsync()
166
177
[ TestMethod ]
167
178
public async Task ConfidentialClientWithClientSecretTestAsync ( )
168
179
{
169
- var confidentialClientAuthority = TestAuthority ;
180
+ await RunTestWithClientSecretAsync ( PublicCloudConfidentialClientID ,
181
+ PublicCloudTestAuthority ,
182
+ _publicCloudCcaSecret ) . ConfigureAwait ( false ) ;
183
+ }
184
+
185
+ [ TestMethod ]
186
+ public async Task ArlingtonConfidentialClientWithClientSecretTestAsync ( )
187
+ {
188
+ await RunTestWithClientSecretAsync ( ArlingtonConfidentialClientIDOBO ,
189
+ ArlingtonAuthority ,
190
+ _arlingtonCCASecret ) . ConfigureAwait ( false ) ;
191
+ }
192
+
193
+ public async Task RunTestWithClientSecretAsync ( string clientID , string authority , string secret )
194
+ {
195
+ var confidentialClientAuthority = authority ;
170
196
171
197
var confidentialApp = ConfidentialClientApplicationBuilder
172
- . Create ( ConfidentialClientID )
198
+ . Create ( clientID )
173
199
. WithAuthority ( new Uri ( confidentialClientAuthority ) , true )
174
- . WithClientSecret ( _ccaSecret )
200
+ . WithClientSecret ( secret )
175
201
. Build ( ) ;
176
202
var appCacheRecorder = confidentialApp . AppTokenCache . RecordAccess ( ) ;
177
203
@@ -196,13 +222,13 @@ public async Task ConfidentialClientWithClientSecretTestAsync()
196
222
[ TestMethod ]
197
223
public async Task ConfidentialClientWithNoDefaultClaimsTestAsync ( )
198
224
{
199
- var confidentialClientAuthority = TestAuthority ;
225
+ var confidentialClientAuthority = PublicCloudTestAuthority ;
200
226
var claims = GetClaims ( ) ;
201
227
202
228
X509Certificate2 cert = GetCertificate ( ) ;
203
229
204
230
var confidentialApp = ConfidentialClientApplicationBuilder
205
- . Create ( ConfidentialClientID )
231
+ . Create ( PublicCloudConfidentialClientID )
206
232
. WithAuthority ( new Uri ( confidentialClientAuthority ) , true )
207
233
. WithClientClaims ( cert , claims , false )
208
234
. Build ( ) ;
@@ -219,13 +245,13 @@ public async Task ConfidentialClientWithNoDefaultClaimsTestAsync()
219
245
[ TestMethod ]
220
246
public async Task ConfidentialClientWithDefaultClaimsTestAsync ( )
221
247
{
222
- var confidentialClientAuthority = TestAuthority ;
248
+ var confidentialClientAuthority = PublicCloudTestAuthority ;
223
249
var claims = GetClaims ( false ) ;
224
250
225
251
X509Certificate2 cert = GetCertificate ( ) ;
226
252
227
253
var confidentialApp = ConfidentialClientApplicationBuilder
228
- . Create ( ConfidentialClientID )
254
+ . Create ( PublicCloudConfidentialClientID )
229
255
. WithAuthority ( new Uri ( confidentialClientAuthority ) , true )
230
256
. WithClientClaims ( cert , claims )
231
257
. Build ( ) ;
@@ -247,13 +273,13 @@ public async Task ConfidentialClientWithDefaultClaimsTestAsync()
247
273
[ TestMethod ]
248
274
public async Task ConfidentialClientWithSignedAssertionTestAsync ( )
249
275
{
250
- var confidentialClientAuthority = TestAuthority ;
276
+ var confidentialClientAuthority = PublicCloudTestAuthority ;
251
277
var claims = GetClaims ( ) ;
252
278
253
279
var confidentialApp = ConfidentialClientApplicationBuilder
254
- . Create ( ConfidentialClientID )
280
+ . Create ( PublicCloudConfidentialClientID )
255
281
. WithAuthority ( new Uri ( confidentialClientAuthority ) , true )
256
- . WithClientAssertion ( GetSignedClientAssertionUsingMsalInternal ( ConfidentialClientID , claims ) )
282
+ . WithClientAssertion ( GetSignedClientAssertionUsingMsalInternal ( PublicCloudConfidentialClientID , claims ) )
257
283
. Build ( ) ;
258
284
259
285
var appCacheRecorder = confidentialApp . AppTokenCache . RecordAccess ( ) ;
@@ -312,10 +338,10 @@ private static IDictionary<string, string> GetClaims(bool useDefaultClaims = tru
312
338
{
313
339
{ "aud" , TestConstants . ClientCredentialAudience } ,
314
340
{ "exp" , exp . ToString ( CultureInfo . InvariantCulture ) } ,
315
- { "iss" , ConfidentialClientID . ToString ( CultureInfo . InvariantCulture ) } ,
341
+ { "iss" , PublicCloudConfidentialClientID . ToString ( CultureInfo . InvariantCulture ) } ,
316
342
{ "jti" , Guid . NewGuid ( ) . ToString ( ) } ,
317
343
{ "nbf" , nbf . ToString ( CultureInfo . InvariantCulture ) } ,
318
- { "sub" , ConfidentialClientID . ToString ( CultureInfo . InvariantCulture ) } ,
344
+ { "sub" , PublicCloudConfidentialClientID . ToString ( CultureInfo . InvariantCulture ) } ,
319
345
{ "ip" , "192.168.2.1" }
320
346
} ;
321
347
}
@@ -361,6 +387,12 @@ public async Task WebAPIAccessingGraphOnBehalfOfUserTestAsync()
361
387
}
362
388
363
389
[ TestMethod ]
390
+ public async Task ArlingtonWebAPIAccessingGraphOnBehalfOfUserTestAsync ( )
391
+ {
392
+ var labResponse = await LabUserHelper . GetArlingtonUserAsync ( ) . ConfigureAwait ( false ) ;
393
+ await RunOnBehalfOfTestAsync ( labResponse ) . ConfigureAwait ( false ) ;
394
+ }
395
+
364
396
[ TestCategory ( TestCategories . ADFS ) ]
365
397
public async Task WebAPIAccessingGraphOnBehalfOfADFS2019UserTestAsync ( )
366
398
{
@@ -470,25 +502,52 @@ private static string GetSignedClientAssertionUsingWilson(
470
502
471
503
private async Task RunOnBehalfOfTestAsync ( LabResponse labResponse )
472
504
{
473
- var user = labResponse . User ;
505
+ LabUser user = labResponse . User ;
506
+ string oboHost ;
507
+ string secret ;
508
+ string authority ;
509
+ string publicClientID ;
510
+ string confidentialClientID ;
511
+ string [ ] oboScope ;
512
+
513
+ switch ( labResponse . User . AzureEnvironment )
514
+ {
515
+ case AzureEnvironment . azureusgovernment :
516
+ oboHost = ArlingtonCloudHost ;
517
+ secret = _keyVault . GetSecret ( TestConstants . MsalArlingtonOBOKeyVaultUri ) . Value ;
518
+ authority = labResponse . Lab . Authority + "organizations" ;
519
+ publicClientID = ArlingtonPublicClientIDOBO ;
520
+ confidentialClientID = ArlingtonConfidentialClientIDOBO ;
521
+ oboScope = s_arlingtonOBOServiceScope ;
522
+ break ;
523
+ default :
524
+ oboHost = PublicCloudHost ;
525
+ secret = _keyVault . GetSecret ( TestConstants . MsalOBOKeyVaultUri ) . Value ;
526
+ authority = TestConstants . AuthorityOrganizationsTenant ;
527
+ publicClientID = PublicCloudPublicClientIDOBO ;
528
+ confidentialClientID = PublicCloudConfidentialClientIDOBO ;
529
+ oboScope = s_publicCloudOBOServiceScope ;
530
+ break ;
531
+ }
474
532
475
- var secret = _keyVault . GetSecret ( TestConstants . MsalOBOKeyVaultUri ) . Value ;
476
533
//TODO: acquire scenario specific client ids from the lab resonse
477
- var publicClientID = "be9b0186-7dfd-448a-a944-f771029105bf" ;
478
- var oboConfidentialClientID = "23c64cd8-21e4-41dd-9756-ab9e2c23f58c" ;
479
534
480
535
SecureString securePassword = new NetworkCredential ( "" , user . GetOrFetchPassword ( ) ) . SecurePassword ;
481
536
482
- var msalPublicClient = PublicClientApplicationBuilder . Create ( publicClientID ) . WithAuthority ( TestConstants . AuthorityOrganizationsTenant ) . WithRedirectUri ( TestConstants . RedirectUri ) . Build ( ) ;
537
+ var msalPublicClient = PublicClientApplicationBuilder . Create ( publicClientID )
538
+ . WithAuthority ( authority )
539
+ . WithRedirectUri ( TestConstants . RedirectUri )
540
+ . Build ( ) ;
483
541
484
- AuthenticationResult authResult = await msalPublicClient
485
- . AcquireTokenByUsernamePassword ( s_oboServiceScope , user . Upn , securePassword )
486
- . ExecuteAsync ( CancellationToken . None )
487
- . ConfigureAwait ( false ) ;
542
+ var builder = msalPublicClient . AcquireTokenByUsernamePassword ( oboScope , user . Upn , securePassword ) ;
543
+
544
+ builder . WithAuthority ( authority ) ;
545
+
546
+ var authResult = await builder . ExecuteAsync ( ) . ConfigureAwait ( false ) ;
488
547
489
548
var confidentialApp = ConfidentialClientApplicationBuilder
490
- . Create ( oboConfidentialClientID )
491
- . WithAuthority ( new Uri ( "https://login.microsoftonline.com/" + authResult . TenantId ) , true )
549
+ . Create ( confidentialClientID )
550
+ . WithAuthority ( new Uri ( oboHost + authResult . TenantId ) , true )
492
551
. WithClientSecret ( secret )
493
552
. Build ( ) ;
494
553
0 commit comments