Exemplo n.º 1
0
        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);
        }