public async Task FailsToCreateAuthorizationRequest_RedirectUri_IsNotAbsolute() { // Arrange var parameters = new Dictionary <string, string[]> { [OpenIdConnectParameterNames.State] = new[] { "state" }, [OpenIdConnectParameterNames.ClientId] = new[] { "a" }, [OpenIdConnectParameterNames.RedirectUri] = new[] { "/callback" } }; var expectedError = new AuthorizationRequestError(ProtocolErrorProvider.InvalidUriFormat("/callback"), null, null); expectedError.Message.State = "state"; var factory = CreateAuthorizationRequestFactory(validRedirectUri: false); // Act var result = await factory.CreateAuthorizationRequestAsync(parameters); // Assert Assert.False(result.IsValid); Assert.Equal(expectedError, result.Error, IdentityServiceErrorComparer.Instance); Assert.Null(result.Error.RedirectUri); Assert.Null(result.Error.ResponseMode); }
private async Task <(string clientId, string redirectUri, OpenIdConnectMessage error)> ValidateClientIdAndRedirectUri( IDictionary <string, string[]> requestParameters, string state) { var(clientId, clientIdError) = RequestParametersHelper.ValidateParameterIsUnique(requestParameters, OpenIdConnectParameterNames.ClientId, _errorProvider); if (clientIdError != null) { clientIdError.State = state; return(null, null, clientIdError); } if (!await _clientIdValidator.ValidateClientIdAsync(clientId)) { clientIdError = _errorProvider.InvalidClientId(clientId); clientIdError.State = state; return(null, null, clientIdError); } var(redirectUri, redirectUriError) = RequestParametersHelper.ValidateOptionalParameterIsUnique(requestParameters, OpenIdConnectParameterNames.RedirectUri, _errorProvider); if (redirectUriError != null) { redirectUriError.State = state; return(null, null, redirectUriError); } if (redirectUri != null) { if (!Uri.IsWellFormedUriString(redirectUri, UriKind.Absolute)) { redirectUriError = _errorProvider.InvalidUriFormat(redirectUri); redirectUriError.State = state; return(null, null, redirectUriError); } var parsedUri = new Uri(redirectUri, UriKind.Absolute); if (!string.IsNullOrEmpty(parsedUri.Fragment)) { redirectUriError = _errorProvider.InvalidUriFormat(redirectUri); redirectUriError.State = state; return(null, null, redirectUriError); } } var resolvedUriResult = await _redirectUrlValidator.ResolveRedirectUriAsync(clientId, redirectUri); if (!resolvedUriResult.IsValid) { resolvedUriResult.Error.State = state; return(null, null, resolvedUriResult.Error); } return(clientId, resolvedUriResult.Uri, null); }