Exemplo n.º 1
0
        /// <summary>
        /// Calls live.com authorization server with the <see cref="OAuthRequestParameters"/> passed in, deserializes the response and returns back OAuth tokens.
        /// </summary>
        /// <param name="oAuthParameters">OAuth parameters for authorization server call</param>
        /// <exception cref="OAuthTokenRequestException">Thrown if tokens can't be received</exception>
        /// <returns>OAuth tokens</returns>
        public async Task <OAuthTokens> GetAccessTokensAsync(OAuthRequestParameters oAuthParameters, bool requireLiveConnect, string tenant, List <KeyValuePair <string, string> > additionalParams)
        {
            OAuthEndpointType endpointType = GetOAuthEndpointType(Environment, requireLiveConnect);

            var values = new List <KeyValuePair <string, string> >()
            {
                new KeyValuePair <string, string>("client_id", oAuthParameters.ClientId),
                new KeyValuePair <string, string>("grant_type", oAuthParameters.GrantType),
                new KeyValuePair <string, string>(oAuthParameters.GrantParamName, oAuthParameters.GrantValue),
                new KeyValuePair <string, string>("scope", EndpointUrls[endpointType].Scope)
            };

            if (oAuthParameters.RedirectUri != null)
            {
                values.Add(new KeyValuePair <string, string>("redirect_uri", oAuthParameters.RedirectUri.ToString()));
            }

            if (!string.IsNullOrEmpty(oAuthParameters.ClientSecret))
            {
                values.Add(new KeyValuePair <string, string>("client_secret", oAuthParameters.ClientSecret));
            }

            if (additionalParams != null)
            {
                values.AddRange(additionalParams);
            }

            var OAuthTokenUrl = EndpointUrls[endpointType].OAuthTokenUrl;

            if (endpointType == OAuthEndpointType.ProductionMSIdentityV2 && !(string.IsNullOrEmpty(tenant)))
            {
                OAuthTokenUrl = OAuthTokenUrl.Replace("common", tenant);
            }

            var response = await _httpService.PostAsync(new Uri(OAuthTokenUrl), values, TimeSpan.FromSeconds(100)).ConfigureAwait(false);


            var stream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false);

            if (response.IsSuccessStatusCode)
            {
                var fragmentsSer = new DataContractJsonSerializer(typeof(Dictionary <string, string>), new DataContractJsonSerializerSettings()
                {
                    UseSimpleDictionaryFormat = true
                });

                var fragments = (Dictionary <string, string>)fragmentsSer.ReadObject(stream);
                return(new OAuthTokens(fragments["access_token"], Convert.ToInt32(fragments["expires_in"]), fragments["refresh_token"], fragments));
            }
            else
            {
                var serializer = new DataContractJsonSerializer(typeof(OAuthErrorDetailsContract));

                var errorDetailsContract = (OAuthErrorDetailsContract)serializer.ReadObject(stream);

                throw new OAuthTokenRequestException(ErrorMessages.OAuthError, new OAuthErrorDetails {
                    Description = errorDetailsContract.Description, Error = errorDetailsContract.Error
                });
            }
        }
        /// <summary>
        /// Calls live.com authorization server with the <see cref="OAuthRequestParameters"/> passed in, deserializes the response and returns back OAuth tokens.
        /// </summary>
        /// <param name="oAuthParameters">OAuth parameters for authorization server call</param>
        /// <exception cref="OAuthTokenRequestException">Thrown if tokens can't be received</exception>
        /// <returns>OAuth tokens</returns>
        public async Task <OAuthTokens> GetAccessTokensAsync(OAuthRequestParameters oAuthParameters)
        {
            var values = new List <KeyValuePair <string, string> >()
            {
                new KeyValuePair <string, string>("client_id", oAuthParameters.ClientId),
                new KeyValuePair <string, string>("grant_type", oAuthParameters.GrantType),
                new KeyValuePair <string, string>(oAuthParameters.GrantParamName, oAuthParameters.GrantValue),
                new KeyValuePair <string, string>("redirect_uri", oAuthParameters.RedirectUri.ToString())
            };

            if (!string.IsNullOrEmpty(oAuthParameters.ClientSecret))
            {
                values.Add(new KeyValuePair <string, string>("client_secret", oAuthParameters.ClientSecret));
            }

            var response = await _httpService.PostAsync(new Uri("https://login.live.com/oauth20_token.srf"), values).ConfigureAwait(false);

            var stream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false);

            if (response.IsSuccessStatusCode)
            {
                var serializer = new DataContractJsonSerializer(typeof(OAuthTokensContract));

                var tokensContract = (OAuthTokensContract)serializer.ReadObject(stream);

                return(new OAuthTokens
                {
                    AccessToken = tokensContract.AccessToken,
                    RefreshToken = tokensContract.RefreshToken,
                    AccessTokenExpiresInSeconds = tokensContract.AccessTokenExpiresInSeconds
                });
            }
            else
            {
                var serializer = new DataContractJsonSerializer(typeof(OAuthErrorDetailsContract));

                var errorDetailsContract = (OAuthErrorDetailsContract)serializer.ReadObject(stream);

                throw new OAuthTokenRequestException(ErrorMessages.OAuthError, new OAuthErrorDetails {
                    Description = errorDetailsContract.Description, Error = errorDetailsContract.Error
                });
            }
        }
        /// <summary>
        /// Calls live.com authorization server with the <see cref="OAuthRequestParameters"/> passed in, deserializes the response and returns back OAuth tokens.
        /// </summary>
        /// <param name="oAuthParameters">OAuth parameters for authorization server call</param>
        /// <exception cref="OAuthTokenRequestException">Thrown if tokens can't be received</exception>
        /// <returns>OAuth tokens</returns>
        public async Task <OAuthTokens> GetAccessTokensAsync(OAuthRequestParameters oAuthParameters)
        {
            var values = new List <KeyValuePair <string, string> >()
            {
                new KeyValuePair <string, string>("client_id", oAuthParameters.ClientId),
                new KeyValuePair <string, string>("grant_type", oAuthParameters.GrantType),
                new KeyValuePair <string, string>(oAuthParameters.GrantParamName, oAuthParameters.GrantValue),
                new KeyValuePair <string, string>("redirect_uri", oAuthParameters.RedirectUri.ToString()),
                new KeyValuePair <string, string>("scope", "bingads.manage")
            };

            if (!string.IsNullOrEmpty(oAuthParameters.ClientSecret))
            {
                values.Add(new KeyValuePair <string, string>("client_secret", oAuthParameters.ClientSecret));
            }

            var response = await _httpService.PostAsync(new Uri(EndpointUrls[Environment].OAuthTokenUrl), values, TimeSpan.FromSeconds(100)).ConfigureAwait(false);

            var stream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false);

            if (response.IsSuccessStatusCode)
            {
                var fragmentsSer = new DataContractJsonSerializer(typeof(Dictionary <string, string>), new DataContractJsonSerializerSettings()
                {
                    UseSimpleDictionaryFormat = true
                });

                var fragments = (Dictionary <string, string>)fragmentsSer.ReadObject(stream);
                return(new OAuthTokens(fragments["access_token"], Convert.ToInt32(fragments["expires_in"]), fragments["refresh_token"], fragments));
            }
            else
            {
                var serializer = new DataContractJsonSerializer(typeof(OAuthErrorDetailsContract));

                var errorDetailsContract = (OAuthErrorDetailsContract)serializer.ReadObject(stream);

                throw new OAuthTokenRequestException(ErrorMessages.OAuthError, new OAuthErrorDetails {
                    Description = errorDetailsContract.Description, Error = errorDetailsContract.Error
                });
            }
        }
        /// <summary>
        /// Calls live.com authorization server with the <see cref="OAuthRequestParameters"/> passed in, deserializes the response and returns back OAuth tokens.
        /// </summary>
        /// <param name="oAuthParameters">OAuth parameters for authorization server call</param>
        /// <exception cref="OAuthTokenRequestException">Thrown if tokens can't be received</exception>
        /// <returns>OAuth tokens</returns>
        public async Task<OAuthTokens> GetAccessTokensAsync(OAuthRequestParameters oAuthParameters)
        {
            var values = new List<KeyValuePair<string, string>>()
            {
                new KeyValuePair<string, string>("client_id", oAuthParameters.ClientId),
                new KeyValuePair<string, string>("grant_type", oAuthParameters.GrantType),
                new KeyValuePair<string, string>(oAuthParameters.GrantParamName, oAuthParameters.GrantValue),
                new KeyValuePair<string, string>("redirect_uri", oAuthParameters.RedirectUri.ToString())
            };

            if (!string.IsNullOrEmpty(oAuthParameters.ClientSecret))
            {
                values.Add(new KeyValuePair<string, string>("client_secret", oAuthParameters.ClientSecret));
            }
            
            var response = await _httpService.PostAsync(new Uri("https://login.live.com/oauth20_token.srf"), values).ConfigureAwait(false);

            var stream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false);

            if (response.IsSuccessStatusCode)
            {                
                var serializer = new DataContractJsonSerializer(typeof(OAuthTokensContract));

                var tokensContract = (OAuthTokensContract)serializer.ReadObject(stream);

                return new OAuthTokens(tokensContract.AccessToken, tokensContract.AccessTokenExpiresInSeconds, tokensContract.RefreshToken);                
            }
            else
            {
                var serializer = new DataContractJsonSerializer(typeof(OAuthErrorDetailsContract));

                var errorDetailsContract = (OAuthErrorDetailsContract)serializer.ReadObject(stream);

                throw new OAuthTokenRequestException(ErrorMessages.OAuthError, new OAuthErrorDetails { Description = errorDetailsContract.Description, Error = errorDetailsContract.Error });
            }
        }