2010-06-13 3 views
10

Я пытаюсь создать модуль аутентификации в CSharp, где мне нужно проверить подпись из запроса, используя библиотеку DotNetOpenAuth (DNOA) для 2 Legged OAuth, которая имеет только потребительский ключ и секрет.Использовал ли кто-нибудь 2 Legged OAuth, используя DNOA?

Если у вас есть выборка 2 Legged OAuth с использованием DNOA, это было бы полезно. Если нет, любые идеи о том, как реализовать, будут работать. Любая помощь будет высоко оценена.

+0

Вы когда-нибудь получали модуль аутентификации? Я ищу что-то подобное. Единственный ответ здесь - создание потребителя. – AlexGad

ответ

6

Мне не удалось заставить DNOA работать с 2-legged OAuth, поэтому я закончил тем, что сделал своего собственного потребителя, используя http://oauth.googlecode.com/svn/code/csharp/OAuthBase.cs как мой базовый класс для обработки подписи подписи. Все, что вам нужно сделать, это подкласс и использовать методы подписи для создания заголовка авторизации HTTP ...

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 + "\""; 

После того, как у вас есть заголовок авторизации просто создать свой веб-запрос и отправить его ...

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; 
    } 
} 

Обновление: Я также смог получить 2-legged для работы с oauth потребителем 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(); 

Было бы хорошо, если бы она была пустой конструктор или перегрузку, которая просто принимает в контексте, но это, кажется, работает.

+0

Просто FYI - но DevDefined.OAuth имеет перегруженные конструкторы OAuthSession, которые используют только потребительский контекст в эти дни, а также поддержку XAuth (как используется API Twitter и т. Д. Https://dev.twitter.com/docs/ oauth/xauth), которые улучшают его двуглавый OAuth 1.0a. – Bittercoder

Смежные вопросы