'RestSharp - Authorization Header not coming across to WCF REST service

I am trying to call a locally hosted WCF REST service over HTTPS with basic auth.

This works and the Authorization header comes thru just fine and all is happy:

ServicePointManager.ServerCertificateValidationCallback = ValidateServerCertficate;
var request = (HttpWebRequest)WebRequest.Create("https://localhost/MyService/MyService.svc/");
request.Method = "GET";
request.ContentType = "application/json";
request.Headers.Add(
  System.Net.HttpRequestHeader.Authorization,
  "Basic " + this.EncodeBasicAuthenticationCredentials("UserA", "123"));

WebResponse webResponse = request.GetResponse();
using (Stream webStream = webResponse.GetResponseStream())
{
    if (webStream != null)
    {
        using (StreamReader responseReader = new StreamReader(webStream))
        {
            string response = responseReader.ReadToEnd();
        }
    }
}

When I try to use RestSharp however, the Authorization header never comes thru on the request:

ServicePointManager.ServerCertificateValidationCallback = ValidateServerCertficate;

var credentials = this.EncodeBasicAuthenticationCredentials("UserA", "123");

var client = new RestSharp.RestClient("https://localhost/MyService/MyService.svc/");   
var restRq = new RestSharp.RestRequest("/");
restRq.Method = Method.GET;
restRq.RootElement = "/";
restRq.AddHeader("Authorization", "Basic " + credentials);
var restRs = client.Execute(restRq);

What am i doing wrong with the RestSharp method?

I know that the AddHeader method works because this:

restRq.AddHeader("Rum", "And Coke");

will come thru, only "Authorization" seems stripped out/missing.



Solution 1:[1]

instead of adding the header 'manually' do the following:

var client = new RestSharp.RestClient("https://localhost/MyService/MyService.svc/");
client.Authenticator = new HttpBasicAuthenticator("UserA", "123");

Solution 2:[2]

I used milano's answer to get my REST service call to work (using GET)

    Dim client2 As RestClient = New RestClient("https://api.clever.com")

    Dim request2 As RestRequest = New RestRequest("me", Method.GET)

    request2.AddParameter("Authorization", "Bearer " & j.access_token, ParameterType.HttpHeader)

    Dim response2 As IRestResponse = client2.Execute(request2)
    Response.Write("** " & response2.StatusCode & "|" & response2.Content & " **")

The key was making sure there was a space after the word 'Bearer' but this may apply to any type of custom token authorization header

Solution 3:[3]

You have to use ParameterType.HttpHeader parameter:

request.AddParameter("Authorization", "data", ParameterType.HttpHeader);

Solution 4:[4]

I was able to get the response from my rest API using this piece of code: My API was returning server error and I used:

request.AddHeader("Authorization", $"Bearer {accessToken}");
var request = new RestRequest("/antiforgerytokensso", Method.Get);

restClient.Authenticator = new JwtAuthenticator(accessToken);

var response = await restClient.ExecuteAsync(request);

Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 wal
Solution 2 j.hull
Solution 3 milanseitler
Solution 4 Jeremy Caney