2010-06-13 15 views
10

Estoy tratando de crear un Módulo de autenticación en CSharp donde necesito verificar la Firma de la solicitud usando la Biblioteca DotNetOpenAuth (DNOA) para OAuth de 2 patas que solo tiene Clave de consumidor y un Secreto.¿Alguien ha implementado 2 Legged OAuth con DNOA?

Si tiene alguna implementación de muestra de 2 Legged OAuth usando DNOA que sería útil. Si no, cualquier idea sobre cómo implementar también funcionaría. Cualquier ayuda sería muy apreciada.

+0

¿Alguna vez se resolvió el módulo de autenticación? Estoy buscando algo similar. La única respuesta aquí es crear un consumidor. – AlexGad

Respuesta

6

No pude obtener DNOA para trabajar con OAuth de dos patas, así que terminé haciendo mi propio consumidor usando http://oauth.googlecode.com/svn/code/csharp/OAuthBase.cs como mi clase base para manejar la firma de firmas. Todo lo que necesita hacer es subclase y utilizar los métodos de firma para construir la cabecera HTTP de autorización ...

string sigMethodType = GetSigMethodType(); 
string ts, nonce, normalizedUrl, normalizedParams; 
string sig = GenerateSignature(new Uri("http://some-endpoint-to-call"), "GET", out nonce, out ts, out normalizedUrl, out normalizedParams); 

string header = "OAuth realm=\"" + normalizedUrl + "\"," + 
       OAuthConsumerKeyKey + "=\"" + ConsumerKey + "\"," + 
       OAuthSignatureMethodKey + "=\"" + "HMACSHA1SignatureType" + "\"," + 
       OAuthSignatureKey + "=\"" + sig + "\"," + 
       OAuthTimestampKey + "=\"" + ts + "\"," + 
       OAuthTokenKey + "=\"" + String.Empty + "\"," + 
       OAuthNonceKey + "=\"" + nonce + "\"," + 
       OAuthVersionKey + "=\"" + OAuthVersion + "\""; 

Una vez que tenga el encabezado de autorización simplemente construir su petición de web y enviarlo ...

var wr = (HttpWebRequest)HttpWebRequest.Create(messageEndpoint.Location); 
wr.Headers.Add(HttpRequestHeader.Authorization, BuildAuthHeader(messageEndpoint)); 
wr.ContentType = messageEndpoint.ContentType; 
wr.Method = CdwHttpMethods.Verbs[messageEndpoint.HttpMethod]; 
using (var resp = (HttpWebResponse)req.GetResponse()) 
{ 
    switch (resp.StatusCode) 
    { 
     case HttpStatusCode.Unauthorized: 
      Assert.Fail("OAuth authorization failed"); 
      break; 
     case HttpStatusCode.OK: 
      using (var stream = resp.GetResponseStream()) 
      { 
       using (var sr = new StreamReader(stream)) 
       { 
        var respString = sr.ReadToEnd(); 
       } 
      } 
      break; 
    } 
} 

Actualización: También pude trabajar con 2 patas para el usuario ode de devdefined. http://code.google.com/p/devdefined-tools/wiki/OAuthConsumer

var endPoint = new Uri("http://example.com/restendpoint.svc"); 
      var ctx = new OAuthConsumerContext 
         { 
          ConsumerKey = "consumerkey1", 
          ConsumerSecret = "consumersecret1", 
          SignatureMethod = SignatureMethod.HmacSha1 
         }; 

      var session = new OAuthSession(ctx, endPoint, endPoint, endPoint); 
      var respText = session.Request().Get().ForUri(endPoint).ToString(); 

Sería bueno si tuviera un constructor vacío o una sobrecarga que sólo toma en el contexto, pero esto parece funcionar.

+0

Solo un FYI, pero DevDefined.OAuth ha sobrecargado los constructores de OAuthSession que solo tienen un contexto de consumo en estos días, así como el soporte para XAuth (como lo usa la API de Twitter, etc. https://dev.twitter.com/docs/ oauth/xauth) que mejora su historia OAuth 1.0a de 2 patas. – Bittercoder

Cuestiones relacionadas