Someone
Someone

Reputation: 379

Https client with authorization in C#

I'm trying to create a https client in C#.

I had HTTP client which worked fine and I changed it to work with HTTPS. But unfortunately there is something wrong with the authorization (the server uses OAuth 2).

My program sends a request to a server and gets the token. But it can't get or send any data from the server.

The server works fine with other clients, so it's not its fault.

This is a piece of code which causes the problem. I know that, because when I comment authorization on the server, the data is send (everything is fine).

    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(
        "Basic", Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(
         string.Format("Authorization: {0}", token))));

This is the whole function, which should send data:

WebRequestHandler handler = new WebRequestHandler();
X509Certificate certificate = GetMyX509Certificate();
handler.ClientCertificates.Add(certificate);
var client = new HttpClient(handler);

string uri = "https://192.168.0.10:8443/data";

client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(
    "Basic", Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(
     string.Format("Authorization: {0}", token))));

client.BaseAddress = new Uri(uri);

var parameters = new Dictionary<string, string>();
parameters["name"] = name;
parameters["surname"] = surname;

JavaScriptSerializer serializer = new JavaScriptSerializer();
var json = serializer.Serialize(parameters);

System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
var response = client.PostAsync(uri, new StringContent(json, System.Text.Encoding.UTF8, "application/json")).Result;

Console.WriteLine((response.StatusCode.ToString()));
string resultContent = response.Content.ReadAsStringAsync().Result;
Console.WriteLine(resultContent);

I guess I'm missing something in the header but can't find any information in the documentation about that. It's a difficult issue so any advice will be very appreciated.

Upvotes: 1

Views: 1867

Answers (1)

Phil Ross
Phil Ross

Reputation: 26100

You shouldn't be including the HTTP header name ("Authorization: ") in the parameter of the AuthenticationHeaderValue. Setting the Authorization property will add the header to the request.

Additionally for OAuth 2, you probably want to be using "Bearer" as the scheme and not encoding token with base64.

Something like this should therefore work:

client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);

Upvotes: 1

Related Questions