예제 #1
0
        public void LogState()
        {
            StringBuilder builder = new StringBuilder(Environment.NewLine + "=== Request Data ===" +
                                                      Environment.NewLine +
                                                      "Authority Provided? - " + (Authority != null) +
                                                      Environment.NewLine);

            builder.AppendLine("Client Id - " + ClientId);
            builder.AppendLine("Scopes - " + Scope?.AsSingleString());
            builder.AppendLine("Redirect Uri - " + RedirectUri?.OriginalString);
            builder.AppendLine("Validate Authority? - " + ValidateAuthority);
            builder.AppendLine("LoginHint provided? - " + !string.IsNullOrEmpty(LoginHint));
            builder.AppendLine("User provided? - " + (User != null));
            var dict = MsalHelpers.ParseKeyValueList(ExtraQueryParameters, '&', true, RequestContext);

            builder.AppendLine("Extra Query Params Keys (space separated) - " + dict.Keys.AsSingleString());
            dict = MsalHelpers.ParseKeyValueList(ExtraQueryParameters, '&', true, RequestContext);
            builder.AppendLine("Slice Parameters Keys(space separated) - " + dict.Keys.AsSingleString());
#if DESKTOP || NETSTANDARD1_3
            builder.AppendLine("Confidential Client? - " + (ClientCredential != null));
            builder.AppendLine("Client Credential Request? - " + IsClientCredentialRequest);
            if (IsClientCredentialRequest)
            {
                builder.AppendLine("Client Certificate Provided? - " + (ClientCredential.Certificate != null));
            }
#endif
            RequestContext.Logger.Info(builder.ToString());
        }
예제 #2
0
        public async Task <AuthorizationResult> AcquireAuthorizationAsync(Uri authorizationUri, Uri redirectUri, RequestContext requestContext)
        {
            if (ExceptionToThrow != null)
            {
                throw ExceptionToThrow;
            }

            IDictionary <string, string> inputQp = MsalHelpers.ParseKeyValueList(authorizationUri.Query.Substring(1), '&', true, null);

            Assert.IsNotNull(inputQp[OAuth2Parameter.State]);
            if (AddStateInAuthorizationResult)
            {
                MockResult.State = inputQp[OAuth2Parameter.State];
            }

            //match QP passed in for validation.
            if (QueryParamsToValidate != null)
            {
                Assert.IsNotNull(authorizationUri.Query);
                foreach (var key in QueryParamsToValidate.Keys)
                {
                    Assert.IsTrue(inputQp.ContainsKey(key));
                    Assert.AreEqual(QueryParamsToValidate[key], inputQp[key]);
                }
            }

            return(await Task.Factory.StartNew(() => MockResult).ConfigureAwait(false));
        }
예제 #3
0
        protected override Task <HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            if (ExceptionToThrow != null)
            {
                throw ExceptionToThrow;
            }

            Assert.AreEqual(Method, request.Method);

            Uri uri = request.RequestUri;

            if (!string.IsNullOrEmpty(Url))
            {
                Assert.AreEqual(Url, uri.AbsoluteUri.Split(new[] { '?' })[0]);
            }

            //match QP passed in for validation.
            if (QueryParams != null)
            {
                Assert.IsFalse(string.IsNullOrEmpty(uri.Query),
                               string.Format(CultureInfo.InvariantCulture,
                                             "provided url ({0}) does not contain query parameters, as expected", uri.AbsolutePath));
                IDictionary <string, string> inputQp = MsalHelpers.ParseKeyValueList(uri.Query.Substring(1), '&', false, null);
                foreach (var key in QueryParams.Keys)
                {
                    Assert.IsTrue(inputQp.ContainsKey(key),
                                  string.Format(CultureInfo.InvariantCulture,
                                                "expected QP ({0}) not found in the url ({1})", key, uri.AbsolutePath));
                    Assert.AreEqual(QueryParams[key], inputQp[key]);
                }
            }

            //match QP passed in for validation.
            if (QueryParams != null)
            {
                Assert.IsFalse(string.IsNullOrEmpty(uri.Query));
                IDictionary <string, string> inputQp = MsalHelpers.ParseKeyValueList(uri.Query.Substring(1), '&', false, null);
                foreach (var key in QueryParams.Keys)
                {
                    Assert.IsTrue(inputQp.ContainsKey(key));
                    Assert.AreEqual(QueryParams[key], inputQp[key]);
                }
            }

            if (PostData != null)
            {
                string postData = request.Content.ReadAsStringAsync().Result;
                Dictionary <string, string> requestPostDataPairs = MsalHelpers.ParseKeyValueList(postData, '&', true, null);

                foreach (var key in PostData.Keys)
                {
                    Assert.IsTrue(requestPostDataPairs.ContainsKey(key));
                    Assert.AreEqual(PostData[key], requestPostDataPairs[key]);
                }
            }

            return(new TaskFactory().StartNew(() => ResponseMessage, cancellationToken));
        }
        private Uri CreateAuthorizationUri(bool addVerifier = false, bool addState = false)
        {
            IDictionary <string, string> requestParameters = this.CreateAuthorizationRequestParameters();

            if (addVerifier)
            {
                _codeVerifier = PlatformPlugin.CryptographyHelper.GenerateCodeVerifier();
                string codeVerifierHash = PlatformPlugin.CryptographyHelper.CreateSha256Hash(_codeVerifier);

                requestParameters[OAuth2Parameter.CodeChallenge]       = MsalHelpers.EncodeToBase64Url(codeVerifierHash);
                requestParameters[OAuth2Parameter.CodeChallengeMethod] = OAuth2Value.CodeChallengeMethodValue;
            }

            if (addState)
            {
                _state = Guid.NewGuid().ToString();
                requestParameters[OAuth2Parameter.State] = _state;
            }

            if (!string.IsNullOrWhiteSpace(AuthenticationRequestParameters.ExtraQueryParameters))
            {
                // Checks for _extraQueryParameters duplicating standard parameters
                Dictionary <string, string> kvps =
                    MsalHelpers.ParseKeyValueList(AuthenticationRequestParameters.ExtraQueryParameters, '&', false,
                                                  this.CallState);

                foreach (KeyValuePair <string, string> kvp in kvps)
                {
                    if (requestParameters.ContainsKey(kvp.Key))
                    {
                        throw new MsalException(MsalError.DuplicateQueryParameter,
                                                string.Format(CultureInfo.InvariantCulture, MsalErrorMessage.DuplicateQueryParameterTemplate,
                                                              kvp.Key));
                    }
                }
            }

            string qp = requestParameters.ToQueryParameter();

            if (!string.IsNullOrEmpty(AuthenticationRequestParameters.ExtraQueryParameters))
            {
                qp += "&" + AuthenticationRequestParameters.ExtraQueryParameters;
            }

            return(new Uri(new Uri(this.Authority.AuthorizationEndpoint), "?" + qp));
        }
예제 #5
0
        public void GetAuthorizationRequestUrlCustomRedirectUriTest()
        {
            ConfidentialClientApplication app =
                new ConfidentialClientApplication(TestConstants.ClientId, TestConstants.AuthorityGuestTenant,
                                                  TestConstants.RedirectUri, new ClientCredential(TestConstants.ClientSecret),
                                                  new TokenCache(), new TokenCache())
            {
                ValidateAuthority = false
            };

            //add mock response for tenant endpoint discovery
            HttpMessageHandlerFactory.AddMockHandler(new MockHttpMessageHandler
            {
                Method          = HttpMethod.Get,
                ResponseMessage = MockHelpers.CreateOpenIdConfigurationResponse(app.Authority)
            });

            const string CustomRedirectUri = "custom://redirect-uri";
            Task <Uri>   task = app.GetAuthorizationRequestUrlAsync(TestConstants.Scope.AsArray(),
                                                                    CustomRedirectUri, TestConstants.DisplayableId, "extra=qp",
                                                                    TestConstants.ScopeForAnotherResource.AsArray(), TestConstants.AuthorityGuestTenant);
            Uri uri = task.Result;

            Assert.IsNotNull(uri);
            Assert.IsTrue(uri.AbsoluteUri.StartsWith(TestConstants.AuthorityGuestTenant, StringComparison.CurrentCulture));
            Dictionary <string, string> qp = MsalHelpers.ParseKeyValueList(uri.Query.Substring(1), '&', true, null);

            Assert.IsNotNull(qp);
            Assert.AreEqual(12, qp.Count);
            Assert.IsTrue(qp.ContainsKey("client-request-id"));
            Assert.IsFalse(qp.ContainsKey("client_secret"));
            Assert.AreEqual("offline_access openid profile r1/scope1 r1/scope2 r2/scope1 r2/scope2", qp["scope"]);
            Assert.AreEqual(TestConstants.ClientId, qp["client_id"]);
            Assert.AreEqual("code", qp["response_type"]);
            Assert.AreEqual(CustomRedirectUri, qp["redirect_uri"]);
            Assert.AreEqual(TestConstants.DisplayableId, qp["login_hint"]);
            Assert.AreEqual("MSAL.Desktop", qp["x-client-sku"]);
            Assert.IsFalse(string.IsNullOrEmpty(qp["x-client-ver"]));
            Assert.IsFalse(string.IsNullOrEmpty(qp["x-client-cpu"]));
            Assert.IsFalse(string.IsNullOrEmpty(qp["x-client-os"]));
            Assert.AreEqual("qp", qp["extra"]);
            Assert.AreEqual("select_account", qp["prompt"]);

            Assert.IsTrue(HttpMessageHandlerFactory.IsMocksQueueEmpty, "All mocks should have been consumed");
        }
예제 #6
0
        public void GetAuthorizationRequestUrlB2CTest()
        {
            ConfidentialClientApplication app = new ConfidentialClientApplication(TestConstants.ClientId,
                                                                                  TestConstants.RedirectUri, new ClientCredential(TestConstants.ClientSecret),
                                                                                  new TokenCache(), new TokenCache())
            {
                ValidateAuthority = false
            };

            //add mock response for tenant endpoint discovery
            HttpMessageHandlerFactory.AddMockHandler(new MockHttpMessageHandler
            {
                Method          = HttpMethod.Get,
                ResponseMessage = MockHelpers.CreateSuccessResponseMessage(File.ReadAllText(@"OpenidConfiguration-B2C.json"))
            });

            Task <Uri> task = app.GetAuthorizationRequestUrlAsync(TestConstants.Scope.AsArray(),
                                                                  TestConstants.DisplayableId, null);
            Uri uri = task.Result;

            Assert.IsNotNull(uri);
            Dictionary <string, string> qp = MsalHelpers.ParseKeyValueList(uri.Query.Substring(1), '&', true, null);

            Assert.IsNotNull(qp);
            Assert.AreEqual(12, qp.Count);
            Assert.AreEqual("my-policy", qp["p"]);
            Assert.IsTrue(qp.ContainsKey("client-request-id"));
            Assert.AreEqual("offline_access openid profile r1/scope1 r1/scope2", qp["scope"]);
            Assert.AreEqual(TestConstants.ClientId, qp["client_id"]);
            Assert.AreEqual("code", qp["response_type"]);
            Assert.AreEqual(TestConstants.RedirectUri, qp["redirect_uri"]);
            Assert.AreEqual(TestConstants.DisplayableId, qp["login_hint"]);
            Assert.AreEqual(UIBehavior.SelectAccount.PromptValue, qp["prompt"]);
            Assert.AreEqual("MSAL.Desktop", qp["x-client-sku"]);
            Assert.IsFalse(string.IsNullOrEmpty(qp["x-client-ver"]));
            Assert.IsFalse(string.IsNullOrEmpty(qp["x-client-cpu"]));
            Assert.IsFalse(string.IsNullOrEmpty(qp["x-client-os"]));

            Assert.IsTrue(HttpMessageHandlerFactory.IsMocksQueueEmpty, "All mocks should have been consumed");
        }
        private void CheckForDuplicateQueryParameters(string queryParams, IDictionary <string, string> requestParameters)
        {
            if (!string.IsNullOrWhiteSpace(queryParams))
            {
                // Checks for _extraQueryParameters duplicating standard parameters
                Dictionary <string, string> kvps =
                    MsalHelpers.ParseKeyValueList(queryParams, '&', false,
                                                  AuthenticationRequestParameters.RequestContext);

                foreach (KeyValuePair <string, string> kvp in kvps)
                {
                    if (requestParameters.ContainsKey(kvp.Key))
                    {
                        throw new MsalClientException(MsalClientException.DuplicateQueryParameterError,
                                                      string.Format(CultureInfo.InvariantCulture, MsalErrorMessage.DuplicateQueryParameterTemplate,
                                                                    kvp.Key));
                    }

                    requestParameters[kvp.Key] = kvp.Value;
                }
            }
        }