Search code examples
c#httpclientsystem.net.httpwebrequest.net-4.7

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

            }

Solution

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