2011-02-04 4 views
1

J'essaie d'utiliser Oauth pour me connecter à Salesforce à partir d'une application .NET. J'utilise DotNetOpenAuth pour le moment et je n'ai pas de chance. Je peux obtenir un bon fonctionnement de twitter/google, mais quand je crée un nouveau service consommateur pour Salesforce, cela me donne juste une erreur (400/Bad Request)Problèmes d'accès à distance Salesforce DotNetOpenAuth/Oauth

J'utilise le InMemoryTokenManager, mais avant de me faire crier à, permettez-moi de réitérer que twitter et al fonctionnent bien de cette façon. J'ai l'intention de remplacer le gestionnaire inmemorytoken par une implentation de base de données, mais pour l'instant je veux juste que ça marche.

La chose étrange est, si je crée manuellement l'URL - https://login.salesforce.com/services/oauth2/authorize?response_type=code & client_id = [consumer_key] & redirect_uri = [REDIRECT_URL] et Entrez-le dans le navigateur, je me retrouve sur une page de Salesforce pour autoriser l'application à accéder à mon compte - celui que je m'attends à voir si tout fonctionne.

Est-ce que ce comportement est attendu? Cela ressemble à un trou de sécurité, mais peut-être que je ne comprends pas tout correctement.

Des idées où je me trompe?

ConsumerCode - (bien, la partie importante au moins)

public static readonly ServiceProviderDescription ServiceDescription = new ServiceProviderDescription 
{ 
    RequestTokenEndpoint = 
     new MessageReceivingEndpoint(
     "https://login.salesforce.com/services/oauth2/authorize", 
     HttpDeliveryMethods.GetRequest | 
     HttpDeliveryMethods.AuthorizationHeaderRequest), 
    UserAuthorizationEndpoint = 
     new MessageReceivingEndpoint(
     "https://login.salesforce.com/services/oauth2/authorize", 
     HttpDeliveryMethods.GetRequest | 
     HttpDeliveryMethods.AuthorizationHeaderRequest), 
    AccessTokenEndpoint = 
     new MessageReceivingEndpoint(
     "https://login.salesforce.com/services/oauth2/token", 
     HttpDeliveryMethods.GetRequest | 
     HttpDeliveryMethods.AuthorizationHeaderRequest), 
    TamperProtectionElements = 
    new ITamperProtectionChannelBindingElement[] { 
    new HmacSha1SigningBindingElement() }, 
}; 

OAuthController.cs

if (this.SFTokenManager != null) 
{ 
    var SF = new WebConsumer(SFConsumer.ServiceDescription, this.SFTokenManager); 
    // Is Twitter calling back with authorization? 
    var accessTokenResponse = SF.ProcessUserAuthorization(); 
    if (accessTokenResponse != null) 
    { 
     this.SFAccessToken = accessTokenResponse.AccessToken; 
    } 
    else if (this.SFAccessToken == null) 
    { 
     // If we don't yet have access, immediately request it. 
     SF.Channel.Send(SF.PrepareRequestUserAuthorization());      
    } 
    return View("SFIn"); 
} 
else 
{ 
    return View("SFOut"); 
} 

La ligne que je reçois mon 400 à est

// If we don't yet have access, immediately request it. 
SF.Channel.Send(SF.PrepareRequestUserAuthorization()); 
+0

On dirait que vous êtes peut-être à l'aide d'un client OAuth1 mais appelant les points d'extrémité oauth2. – superfell

Répondre

2

DotNetOpenAuth dit son Le support oAuth est 1.0 & 1.0a, pendant que vous essayez d'accéder à l'oAuth 2.0 service à salesforce, les 2 protocoles ne sont pas compatibles.

+1

oAuth2 est assez simple, vous devriez être capable de l'utiliser directement sans avoir besoin de toute boîte à outils. – superfell

+0

Merci superfell, mais j'ai aussi essayé les points de terminaison oAuth 1.0 et obtenu la même réponse - 400/mauvaise demande. Quelque chose ne va pas bien avant que le mauvais protocole commence à causer des problèmes. – roryok

+0

J'ai été rebuté par ce post [http://www.rumbleware.com/blog/2009/10/authenticating-salesforce-com-apps-using-oauth/], qui recommandait d'utiliser une bibliothèque, bien que cela semble aussi se référer à OAuth1.0 qui semble plus complexe – roryok

1

Je ne connais rien à SalesForce, mais à partir de votre message, il semble que SalesForce utilise OAuth 2.0. Mais vous utilisez la fonction OAuth 1.0 (a) de DotNetOpenAuth, ce qui expliquerait pourquoi elle échoue.

Vous pouvez essayer d'utiliser le OAuth 2.0 CTP version of DotNetOpenAuth et d'utiliser la nouvelle API pour OAuth 2.0 pour voir si cela vous aide.

Questions connexes