2012-10-03 3 views
5

Ich versuche, einen Client für das neue tent.io-Protokoll zu erstellen, das entwickelt wird, und sie verwenden das HTTP MAC Oauth2-Schema, das von http://tools.ietf.org/html/draft-ietf-oauth-v2-http-mac-01 beschrieben wird.HTTP MAC-Authentifizierung mit C#

Ich habe eine einfache Methode in C# geschrieben, die den Berechtigungsheader erstellt, aber wenn ich meine Anfrage abschicke, erhalte ich einen einfachen "Ungültige MAC-Signatur" -Fehler.

Da ich keine Referenzimplementierung habe, muss ich herausfinden, was mit meinem Code nicht stimmt. Ich poste es hier in der Hoffnung, dass jemand meinen Fehler entdecken kann.

public string GetAuthorizationHeader(string macKeyIdentifier, string macKey, string macAlgorithm, string method, Uri uri) 
{ 
    TimeSpan t = (DateTime.UtcNow - new DateTime(1970, 1, 1)); 
    string timestamp = ((int)t.TotalSeconds).ToString(); 

    string nonce = new Random().Next().ToString(); 

    string normalizedString = string.Format("{0}\n{1}\n{2}\n{3}\n{4}\n{5}\n\n", 
              timestamp, 
              nonce, 
              method, 
              uri.PathAndQuery, 
              uri.Host, 
              uri.Port); 

    HashAlgorithm hashGenerator = null; 
    if (macAlgorithm == "hmac-sha-256") 
    { 
     hashGenerator = new HMACSHA256(Encoding.ASCII.GetBytes(macKey)); 
    } 
    else if (macAlgorithm == "hmac-sha-1") 
    { 
     hashGenerator = new HMACSHA1(Encoding.ASCII.GetBytes(macKey)); 
    } 
    else 
    { 
     throw new InvalidOperationException("Unsupported MAC algorithm"); 
    } 

    string hash = System.Convert.ToBase64String(hashGenerator.ComputeHash(Encoding.ASCII.GetBytes(normalizedString))); 

    StringBuilder authorizationHeader = new StringBuilder(); 
    authorizationHeader.AppendFormat(@"id=""{0}"",ts=""{1}"",nonce=""{2}"",mac=""{3}""", 
            macKeyIdentifier, timestamp, nonce, hash); 

    return authorizationHeader.ToString(); 
} 

Ich schaffe den vollständigen Header den zurückgegebenen Wert verwenden und es sieht etwas lke diesem

Berechtigung: MAC id = "a: dfsdfa2", ts = "1349277638", nonce = "1469030797", mac = "ibZ/HXaoz2VgBer3CK7K9vu0po3K + E36K + TQ9Sgcw6o ="

Ich bin sicher, dass ich etwas kleines vermisse, aber ich kann es nicht sehen.

Jede Hilfe würde sehr geschätzt werden!

+0

Sie müssen Ihren Code neu formatieren –

Antwort

3

Es stellt sich den Code oben aus ist perfekt, aber ich war die falsche HTTP-Methode Wert in es vorbei!

Wo ich den Fehler bekam, war ich POST JSON, aber ich hatte tatsächlich "GET" in die GetAuthorizationMethod!

Sobald ich das korrigiert hatte, bekam ich einen access_token Wert von Tent.is.