Passing Authorization Header in multiple redirects of HttpClient

I'm sending a get request to the server, the server is redirecting to 4 furthur call and then returns the response. HttpClient gives the exception, no authorization token is provided.

Can you tell me, how to pass the same authorization token on multiple redirects? It works fine if I set "AllowAutoRedirect=false" & returns RanToComplation Status. Here is my method :

static async Task CallWebAPIAsync()
        {

            WebRequestHandler webRequestHandler = new WebRequestHandler();
            webRequestHandler.UseDefaultCredentials = true;
             webRequestHandler.AllowPipelining = true;
            webRequestHandler.AllowAutoRedirect = true;

            using (var client = new HttpClient(webRequestHandler))
            {
                client.BaseAddress = new Uri("https://apirequest");
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", token);
                client.Timeout = TimeSpan.FromSeconds(30000);
                //GET Method  
                var response = await client.GetAsync("user").ConfigureAwait(false); 
                if (response.IsSuccessStatusCode)
                {
                    var responseresult = await response.Content.ReadAsStringAsync();
                    Console.WriteLine("Id:{0}\tName:{1}", responseresult);
                }
                else
                {
                    Console.WriteLine("Internal server Error");
                }

            }

Upvotes: 0

Views: 4545

Answers (2)

Christian Findlay
Christian Findlay

Reputation: 7692

I think the problem may be related to this

Authorization headers must be stripped on redirects. I'm currently trying to figure out how to work around it.

Upvotes: 1

I was missing the delegation handler, which will handle the redirects. https://stackoverflow.com/a/19493338/3459965 this link helps me

Updated Code is:

 static async Task CallWebAPIAsync()
    {
        HttpClientHandler clientHandler = new HttpClientHandler();
        WebRequestHandler webRequestHandler = new WebRequestHandler();
        webRequestHandler.UseDefaultCredentials = true;
         webRequestHandler.AllowPipelining = true;
        webRequestHandler.AllowAutoRedirect = false;
        webRequestHandler.Credentials = CredentialCache.DefaultCredentials;


        GlobalRedirectHandler globalRedirectHandler = new GlobalRedirectHandler() { InnerHandler = webRequestHandler };


        using (var client = new HttpClient(globalRedirectHandler))
        {
            client.BaseAddress = new Uri("https://apitest");
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", token);


            client.Timeout = TimeSpan.FromSeconds(30000);
            //GET Method  
            var response = await client.GetAsync("user").ConfigureAwait(false); 
            if (response.IsSuccessStatusCode)
            {
                var responseresult = await response.Content.ReadAsStringAsync();
                Console.WriteLine("Id:{0}\tName:{1}", responseresult);
            }
            else
            {
                Console.WriteLine("Internal server Error");
            }

        }
    }

Upvotes: 0

Related Questions