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()); }
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)); }
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)); }
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"); }
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; } } }