Exemple #1
0
        public async Task AcquireTokenSilent_LoginHint_MultipleAccountsAsync()
        {
            var receiver = new MyReceiver();

            using (var httpManager = new MockHttpManager())
            {
                PublicClientApplication app = PublicClientApplicationBuilder.Create(TestConstants.ClientId)
                                              .WithAuthority(new Uri(TestConstants.AuthorityTestTenant), true)
                                              .WithHttpManager(httpManager)
                                              .WithTelemetry(receiver.HandleTelemetryEvents)
                                              .BuildConcrete();

                var tokenCacheHelper = new TokenCacheHelper();
                var cacheAccess      = app.UserTokenCache.RecordAccess();

                tokenCacheHelper.PopulateCache(app.UserTokenCacheInternal.Accessor, "uid1", "utid");
                tokenCacheHelper.PopulateCache(app.UserTokenCacheInternal.Accessor, "uid2", "utid");

                var exception = await AssertException.TaskThrowsAsync <MsalUiRequiredException>(async() => await app.AcquireTokenSilent(
                                                                                                    TestConstants.s_scope.ToArray(),
                                                                                                    TestConstants.DisplayableId)
                                                                                                .WithAuthority(app.Authority, false)
                                                                                                .ExecuteAsync().ConfigureAwait(false)).ConfigureAwait(false);

                Assert.AreEqual(MsalError.MultipleAccountsForLoginHint, exception.ErrorCode);
                Assert.AreEqual(UiRequiredExceptionClassification.AcquireTokenSilentFailed, exception.Classification);
                cacheAccess.AssertAccessCounts(1, 0);
            }
        }
Exemple #2
0
        public async Task AcquireTokenSilentScopeAndEmptyCacheTestAsync()
        {
            var receiver = new MyReceiver();
            PublicClientApplication app = PublicClientApplicationBuilder.Create(TestConstants.ClientId)
                                          .WithAuthority(new Uri(ClientApplicationBase.DefaultAuthority), true)
                                          .WithTelemetry(receiver.HandleTelemetryEvents)
                                          .BuildConcrete();

            try
            {
                AuthenticationResult result = await app
                                              .AcquireTokenSilent(
                    TestConstants.s_scope.ToArray(),
                    new Account(TestConstants.s_userIdentifier, TestConstants.DisplayableId, null))
                                              .ExecuteAsync(CancellationToken.None)
                                              .ConfigureAwait(false);
            }
            catch (MsalUiRequiredException exc)
            {
                Assert.AreEqual(MsalError.NoTokensFoundError, exc.ErrorCode);
                Assert.AreEqual(UiRequiredExceptionClassification.AcquireTokenSilentFailed, exc.Classification);
            }

            Assert.IsNotNull(
                receiver.EventsReceived.Find(
                    anEvent => // Expect finding such an event
                    anEvent[EventBase.EventNameKey].EndsWith("api_event") &&
                    anEvent[MsalTelemetryBlobEventNames.ApiIdConstStrKey] == "1007" &&
                    anEvent[ApiEvent.WasSuccessfulKey] == "false" &&
                    anEvent[ApiEvent.ApiErrorCodeKey] == "no_tokens_found"));
        }
Exemple #3
0
 public void Initialize()
 {
     TestCommon.ResetStateAndInitMsal();
     _myReceiver              = new MyReceiver();
     _telemetryManager        = new TelemetryManager(_myReceiver);
     Logger.PiiLoggingEnabled = false;
 }
Exemple #4
0
        public async Task ConfidentialClientUsingCertificateTelemetryTestAsync()
        {
            var receiver = new MyReceiver();

            using (var httpManager = new MockHttpManager())
            {
                httpManager.AddInstanceDiscoveryMockHandler();

                var cert   = new X509Certificate2(ResourceHelper.GetTestResourceRelativePath("valid.crtfile"));
                var app    = CreateConfidentialClient(httpManager, cert, 1, receiver.HandleTelemetryEvents);
                var result = await app.AcquireTokenForClient(MsalTestConstants.Scope.ToArray()).ExecuteAsync(CancellationToken.None).ConfigureAwait(false);

                Assert.IsNotNull(
                    receiver.EventsReceived.Find(
                        anEvent => // Expect finding such an event
                        anEvent[EventBase.EventNameKey].EndsWith("http_event") &&
                        anEvent[HttpEvent.ResponseCodeKey] == "200" && anEvent[HttpEvent.HttpPathKey]
                        .Contains(
                            EventBase
                            .TenantPlaceHolder)             // The tenant info is expected to be replaced by a holder
                        ));

                Assert.IsNotNull(
                    receiver.EventsReceived.Find(
                        anEvent => // Expect finding such an event
                        anEvent[EventBase.EventNameKey].EndsWith("api_event") &&
                        anEvent[ApiEvent.WasSuccessfulKey] == "true" && anEvent[MsalTelemetryBlobEventNames.ApiIdConstStrKey] == "1004"));
            }
        }
Exemple #5
0
        private void RunAcquireTokenSilentCacheOnlyTest(string authority, bool expectNetworkDiscovery)
        {
            var receiver = new MyReceiver();

            using (MockHttpAndServiceBundle testHarness = base.CreateTestHarness())
            {
                PublicClientApplication app = PublicClientApplicationBuilder.Create(TestConstants.ClientId)
                                              .WithAuthority(authority, true)
                                              .WithHttpManager(testHarness.HttpManager)
                                              .WithTelemetry(receiver.HandleTelemetryEvents)
                                              .BuildConcrete();

                var tokenCacheHelper = new TokenCacheHelper();
                tokenCacheHelper.PopulateCache(app.UserTokenCacheInternal.Accessor);

                app.UserTokenCacheInternal.Accessor.DeleteAccessToken(new MsalAccessTokenCacheKey(
                                                                          TestConstants.ProductionPrefNetworkEnvironment,
                                                                          TestConstants.Utid,
                                                                          TestConstants.s_userIdentifier,
                                                                          TestConstants.ClientId,
                                                                          TestConstants.ScopeForAnotherResourceStr,
                                                                          TestConstants.Bearer));

                if (expectNetworkDiscovery)
                {
                    string host          = new Uri(authority).Host;
                    string discoveryHost = KnownMetadataProvider.IsKnownEnvironment(host)
                                               ? host
                                               : AadAuthority.DefaultTrustedHost;

                    string discoveryEndpoint = $"https://{discoveryHost}/common/discovery/instance";

                    var jsonResponse = TestConstants.DiscoveryJsonResponse.Replace("login.microsoft.com", host);
                    testHarness.HttpManager.AddMockHandler(
                        MockHelpers.CreateInstanceDiscoveryMockHandler(discoveryEndpoint, jsonResponse));
                }

                Task <AuthenticationResult> task = app
                                                   .AcquireTokenSilent(
                    TestConstants.s_scope.ToArray(),
                    new Account(TestConstants.s_userIdentifier, TestConstants.DisplayableId, null))
                                                   .WithAuthority(app.Authority, false)
                                                   .WithForceRefresh(false)
                                                   .ExecuteAsync(CancellationToken.None);

                AuthenticationResult result = task.Result;
                Assert.IsNotNull(result);
                Assert.AreEqual(TestConstants.DisplayableId, result.Account.Username);
                Assert.AreEqual(TestConstants.s_scope.AsSingleString(), result.Scopes.AsSingleString());

                Assert.AreEqual(2, app.UserTokenCacheInternal.Accessor.GetAllAccessTokens().Count());
                Assert.AreEqual(1, app.UserTokenCacheInternal.Accessor.GetAllRefreshTokens().Count());
                Assert.IsNotNull(receiver.EventsReceived.Find(anEvent =>  // Expect finding such an event
                                                              anEvent[EventBase.EventNameKey].EndsWith("api_event") && anEvent[ApiEvent.WasSuccessfulKey] == "true" &&
                                                              anEvent[MsalTelemetryBlobEventNames.ApiIdConstStrKey] == "1007"));
            }
        }
Exemple #6
0
 private static void RunWithMockHttp(Action <MockHttpManager, IServiceBundle, MyReceiver> action)
 {
     using (var httpManager = new MockHttpManager())
     {
         var receiver      = new MyReceiver();
         var serviceBundle = ServiceBundle.CreateWithCustomHttpManager(httpManager, receiver);
         action(httpManager, serviceBundle, receiver);
     }
 }
Exemple #7
0
 private static async Task RunWithMockHttpAsync(Func <MockHttpManager, IServiceBundle, MyReceiver, Task> action)
 {
     using (var httpManager = new MockHttpManager())
     {
         var receiver      = new MyReceiver();
         var serviceBundle = ServiceBundle.CreateWithCustomHttpManager(httpManager, receiver);
         await action(httpManager, serviceBundle, receiver).ConfigureAwait(false);
     }
 }
 public void Initialize()
 {
     TestCommon.ResetInternalStaticCaches();
     _myReceiver       = new MyReceiver();
     _serviceBundle    = TestCommon.CreateServiceBundleWithCustomHttpManager(null, clientId: ClientId);
     _logger           = _serviceBundle.DefaultLogger;
     _platformProxy    = _serviceBundle.PlatformProxy;
     _crypto           = _platformProxy.CryptographyManager;
     _telemetryManager = new TelemetryManager(_serviceBundle.Config, _platformProxy, _myReceiver.HandleTelemetryEvents);
 }
Exemple #9
0
        public void TelemetryPublicApiSample()
        {
            var telemetry = Telemetry.GetInstance();
            var receiver  = new MyReceiver();

            telemetry.RegisterReceiver(receiver.HandleTelemetryEvents);

            // Or you can use a one-liner:
            Telemetry.GetInstance().RegisterReceiver(new MyReceiver().HandleTelemetryEvents);
        }
Exemple #10
0
        public async Task ForceRefreshParameterTrueTestAsync()
        {
            var receiver = new MyReceiver();

            using (var httpManager = new MockHttpManager())
            {
                httpManager.AddInstanceDiscoveryMockHandler();

                var app = ConfidentialClientApplicationBuilder
                          .Create(MsalTestConstants.ClientId)
                          .WithAuthority(new Uri(MsalTestConstants.AuthorityTestTenant), true)
                          .WithRedirectUri(MsalTestConstants.RedirectUri)
                          .WithClientSecret(MsalTestConstants.ClientSecret)
                          .WithHttpManager(httpManager)
                          .WithTelemetry(receiver.HandleTelemetryEvents)
                          .BuildConcrete();

                _tokenCacheHelper.PopulateCache(app.AppTokenCacheInternal.Accessor);

                httpManager.AddMockHandlerForTenantEndpointDiscovery(app.Authority);

                // add mock response for successful token retrieval
                const string TokenRetrievedFromNetCall = "token retrieved from network call";
                httpManager.AddMockHandler(
                    new MockHttpMessageHandler
                {
                    ExpectedMethod  = HttpMethod.Post,
                    ResponseMessage =
                        MockHelpers.CreateSuccessfulClientCredentialTokenResponseMessage(TokenRetrievedFromNetCall)
                });

                var result = await app
                             .AcquireTokenForClient(MsalTestConstants.Scope)
                             .WithForceRefresh(true)
                             .ExecuteAsync(CancellationToken.None)
                             .ConfigureAwait(false);

                Assert.AreEqual(TokenRetrievedFromNetCall, result.AccessToken);

                // make sure token in Cache was updated
                var accessTokens = await app.AppTokenCacheInternal.GetAllAccessTokensAsync(true).ConfigureAwait(false);

                var accessTokenInCache = accessTokens
                                         .Where(item => ScopeHelper.ScopeContains(item.ScopeSet, MsalTestConstants.Scope))
                                         .ToList().FirstOrDefault();

                Assert.AreEqual(TokenRetrievedFromNetCall, accessTokenInCache.Secret);
                Assert.IsNotNull(
                    receiver.EventsReceived.Find(
                        anEvent => // Expect finding such an event
                        anEvent[EventBase.EventNameKey].EndsWith("api_event") &&
                        anEvent[ApiEvent.WasSuccessfulKey] == "true" && anEvent[MsalTelemetryBlobEventNames.ApiIdConstStrKey] == "1004"));
            }
        }
Exemple #11
0
        public void AcquireTokenSilentCacheOnlyLookupTest()
        {
            var receiver = new MyReceiver();

            using (var httpManager = new MockHttpManager())
            {
                PublicClientApplication app = PublicClientApplicationBuilder.Create(MsalTestConstants.ClientId)
                                              .WithAuthority(new Uri(MsalTestConstants.AuthorityTestTenant), true)
                                              .WithHttpManager(httpManager)
                                              .WithTelemetry(receiver.HandleTelemetryEvents)
                                              .BuildConcrete();
                _tokenCacheHelper.PopulateCache(app.UserTokenCacheInternal.Accessor);

                app.UserTokenCacheInternal.Accessor.DeleteAccessToken(new MsalAccessTokenCacheKey(
                                                                          MsalTestConstants.ProductionPrefNetworkEnvironment,
                                                                          MsalTestConstants.Utid,
                                                                          MsalTestConstants.UserIdentifier,
                                                                          MsalTestConstants.ClientId,
                                                                          MsalTestConstants.ScopeForAnotherResourceStr));

                httpManager.AddInstanceDiscoveryMockHandler();

                Task <AuthenticationResult> task = app
                                                   .AcquireTokenSilent(
                    MsalTestConstants.Scope.ToArray(),
                    new Account(MsalTestConstants.UserIdentifier, MsalTestConstants.DisplayableId, null))
                                                   .WithAuthority(app.Authority, false)
                                                   .WithForceRefresh(false)
                                                   .ExecuteAsync(CancellationToken.None);

                AuthenticationResult result = task.Result;
                Assert.IsNotNull(result);
                Assert.AreEqual(MsalTestConstants.DisplayableId, result.Account.Username);
                Assert.AreEqual(MsalTestConstants.Scope.AsSingleString(), result.Scopes.AsSingleString());

                Assert.AreEqual(2, app.UserTokenCacheInternal.Accessor.GetAllAccessTokens().Count());
                Assert.AreEqual(1, app.UserTokenCacheInternal.Accessor.GetAllRefreshTokens().Count());
                Assert.IsNotNull(receiver.EventsReceived.Find(anEvent =>  // Expect finding such an event
                                                              anEvent[EventBase.EventNameKey].EndsWith("api_event") && anEvent[ApiEvent.WasSuccessfulKey] == "true" &&
                                                              anEvent[MsalTelemetryBlobEventNames.ApiIdConstStrKey] == "31"));
            }
        }
Exemple #12
0
        public void TelemetrySkipEventsIfApiEventWasSuccessful()
        {
            var myReceiver = new MyReceiver
            {
                OnlySendFailureTelemetry = true
            };

            var telemetryManager = new TelemetryManager(myReceiver);
            var telemetry        = (ITelemetry)telemetryManager;

            var reqId = telemetryManager.GenerateNewRequestId();

            try
            {
                var e1 = new ApiEvent(new MsalLogger(Guid.NewGuid(), null))
                {
                    Authority = new Uri("https://login.microsoftonline.com"), AuthorityType = "Aad"
                };
                telemetry.StartEvent(reqId, e1);
                // do some stuff...
                e1.WasSuccessful = true;
                telemetry.StopEvent(reqId, e1);

                var e2 = new UiEvent()
                {
                    UserCancelled = false
                };
                telemetry.StartEvent(reqId, e2);
                telemetry.StopEvent(reqId, e2);

                var e3 = new UiEvent()
                {
                    AccessDenied = false
                };
                telemetry.StartEvent(reqId, e3);
                telemetry.StopEvent(reqId, e3);
            }
            finally
            {
                telemetry.Flush(reqId, ClientId);
            }
            Assert.AreEqual(0, myReceiver.EventsReceived.Count);

            reqId = telemetryManager.GenerateNewRequestId();
            try
            {
                var e1 = new ApiEvent(new MsalLogger(Guid.NewGuid(), null))
                {
                    Authority = new Uri("https://login.microsoftonline.com"), AuthorityType = "Aad"
                };
                telemetry.StartEvent(reqId, e1);
                // do some stuff...
                e1.WasSuccessful = false;  // mimic an unsuccessful event, so that this batch should be dispatched
                telemetry.StopEvent(reqId, e1);

                var e2 = new UiEvent()
                {
                    UserCancelled = true
                };
                telemetry.StartEvent(reqId, e2);
                telemetry.StopEvent(reqId, e2);

                var e3 = new UiEvent()
                {
                    AccessDenied = true
                };
                telemetry.StartEvent(reqId, e3);
                telemetry.StopEvent(reqId, e3);
            }
            finally
            {
                telemetry.Flush(reqId, ClientId);
            }
            Assert.IsTrue(myReceiver.EventsReceived.Count > 0);
        }