using System.Collections.Generic;
using System.Security.Cryptography;
static void Main(string[] args)
var parameters = new Dictionary<string, string>();
StudentEmail = "student100@school33.ep.com",
AssignmentTitle = "Book Report on Pride and Prejudice - 20/june 2019 - Mr Woser - Class 10A",
AssignmentText = "abcd-> ",
TeacherEmail = "teacher20@school33.ep.com"
parameters.Add("student_email", input.StudentEmail);
parameters.Add("assignment_id", input.AssignmentId);
parameters.Add("assignment_title", input.AssignmentTitle);
parameters.Add("assignment_text", input.AssignmentText);
parameters.Add("teacher_email", input.TeacherEmail);
var requestMethod = "POST";
var url = "https://www.example.org/";
var consumerKey = "abc123";
var consumerSecret = "123abc";
var token = string.Empty;
var nonce = Guid.NewGuid().ToString("N");
var timeStamp = Math.Truncate((DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds).ToString();
var oAuthVersion = "1.0";
var signatureMethod = "HMAC-SHA256";
parameters.Add("oauth_token", token);
parameters.Add("oauth_consumer_key", consumerKey);
parameters.Add("oauth_nonce", nonce);
parameters.Add("oauth_timestamp", timeStamp);
parameters.Add("oauth_version", oAuthVersion);
parameters.Add("oauth_signature_method", signatureMethod);
var parameterString = BuildParameterString(parameters);
Console.WriteLine("Parameter string:");
Console.WriteLine(parameterString);
var signatureBaseString = BuildSignatureBaseString(requestMethod, url, parameterString);
Console.WriteLine("Signature Base String:");
Console.WriteLine(signatureBaseString);
var signingKey = $"{HttpUtility.UrlEncode(consumerSecret)}&{HttpUtility.UrlEncode(token)}";
string signatureBase64 = GenerateSignature(signingKey, signatureBaseString);
Console.WriteLine("Signature:");
Console.WriteLine(signatureBase64);
parameters.Add("oauth_signature", signatureBase64);
var requestJson = JsonConvert.SerializeObject(parameters, Formatting.Indented);
Console.WriteLine("Request body:");
Console.WriteLine(requestJson);
private static string GenerateSignature(string signingKey, string signatureBaseString)
using (var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(signingKey)))
var signatureBytes = hmac.ComputeHash(Encoding.UTF8.GetBytes(signatureBaseString));
return Convert.ToBase64String(signatureBytes);
private static string BuildSignatureBaseString(string requestMethod, string requestUrl, string parameterString)
requestMethod = requestMethod.ToUpperInvariant();
var encodedUrl = HttpUtility.UrlEncode(requestUrl);
var encodedParamString = HttpUtility.UrlEncode(parameterString);
return $"{requestMethod}&{encodedUrl}&{encodedParamString}";
private static string BuildParameterString(Dictionary<string, string> parameters)
var encodedSorted = parameters.Select(kvp => (Key: HttpUtility.UrlEncode(kvp.Key), Value: HttpUtility.UrlEncode(kvp.Value)))
var builder = new StringBuilder();
foreach (var (key, value) in encodedSorted)
return builder.ToString();