Проблемы с удаленным доступом Salesforce DotNetOpenAuth / Oauth - PullRequest
1 голос
/ 04 февраля 2011

Я пытаюсь использовать Oauth для подключения к salesforce из приложения .NET.Я использую DotNetOpenAuth на данный момент, и мне не повезло.Я могу заставить Twitter / Google и т. Д. Работать нормально, но когда я создаю новый потребительский сервис для Salesforce, он просто выдает мне ошибку (400 / Bad Request)

Я использую InMemoryTokenManager, но до того, как якричите на, позвольте мне повторить, что Twitter и др. работают нормально таким образом.Я намерен заменить менеджер inmemorytoken имплантацией базы данных, но сейчас я просто хочу, чтобы он работал.

Странно то, что если я вручную создаю URL - https://login.salesforce.com/services/oauth2/authorize?response_type=code&client_id=[consumer_key]&redirect_uri=[redirect_url] и ввожу его в браузер, я попадаю на страницу Salesforce, чтобы авторизовать приложение для доступа к моей учетной записи - той, которую я ожидаючтобы увидеть все должно работать.

Это ожидаемое поведение?Это похоже на дыру в безопасности, но, возможно, я не все правильно понимаю.

Есть идеи, где я ошибаюсь?

ConsumerCode - (ну, по крайней мере, важная часть)

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

Строка, по которой я получаю мои 400, равна

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

Ответы [ 3 ]

2 голосов
/ 04 февраля 2011

DotNetOpenAuth говорит, что его поддержка oAuth составляет 1.0 и 1.0a, в то время как вы пытаетесь получить доступ к сервису oAuth 2.0 в salesforce, эти 2 протокола не совместимы.

1 голос
/ 05 февраля 2011

Я ничего не знаю о SalesForce, но из вашего сообщения видно, что SalesForce использует OAuth 2.0.Но вы используете функцию OAuth 1.0 (a) DotNetOpenAuth, которая объясняет причину ее сбоя.

Вы можете попробовать использовать CTP-версию OAuth 2.0 DotNetOpenAuth и использовать новый API для OAuth.2.0, чтобы увидеть, помогает ли это.

0 голосов
/ 25 февраля 2011

Пример Salesforce Rest API и .net http://danlb.blogspot.com/2010/10/salesforcecom-rest-api.html

...