Salesforce DotNetOpenAuth/Oauth远程访问问题

Salesforce DotNetOpenAuth/Oauth远程访问问题,oauth,dotnetopenauth,salesforce,Oauth,Dotnetopenauth,Salesforce,我正在尝试使用Oauth从.NET应用程序连接到salesforce。我现在使用的是DotNetOpenAuth,运气不好。我可以让twitter/google等正常工作,但当我为Salesforce创建新的消费者服务时,它只会给我一个错误(400/错误请求) 我使用的是InMemoryTokenManager,但在我被骂之前,让我重申一下twitter等的工作原理。我确实打算用数据库实现来替换inmemorytoken管理器,但现在我只想让它工作起来 奇怪的是,如果我手动创建URL-https

我正在尝试使用Oauth从.NET应用程序连接到salesforce。我现在使用的是DotNetOpenAuth,运气不好。我可以让twitter/google等正常工作,但当我为Salesforce创建新的消费者服务时,它只会给我一个错误(400/错误请求)

我使用的是InMemoryTokenManager,但在我被骂之前,让我重申一下twitter等的工作原理。我确实打算用数据库实现来替换inmemorytoken管理器,但现在我只想让它工作起来

奇怪的是,如果我手动创建URL-https://login.salesforce.com/services/oauth2/authorize?response_type=code&client_id=[消费者密钥]&重定向\u uri=[重定向\u url]在浏览器中输入后,我会进入salesforce页面,授权该应用程序访问我的帐户——如果一切正常,我希望看到这个应用程序

这是预期的行为吗?这看起来像是一个安全漏洞,但也许我没有正确理解每件事

知道我哪里出错了吗

消费者代码-(嗯,至少是重要部分)

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());   

表示其oAuth支持为1.0和1.0a,当您试图访问salesforce的oAuth 2.0服务时,这两个协议不兼容。

我对salesforce一无所知,但从您的消息来看,salesforce似乎使用了oAuth 2.0。但是您使用的是DotNetOpenAuth的OAuth 1.0(a)特性,这可以解释它失败的原因


您可以尝试使用和使用OAuth 2.0的新API,看看这是否有帮助。

salesforce Rest API和.net示例

听起来您可能正在使用oAuth1客户端,但调用oAuth2端点非常简单,您应该能够直接使用它,而不需要任何工具包。感谢superfell,不过我也尝试了oAuth 1.0端点,得到了相同的响应-400/错误请求。在错误的协议开始导致问题之前很久,就出现了一些问题。我被这篇文章[建议使用库]所推迟,尽管它似乎也提到了OAuth1.0,它似乎更复杂。关于手动实现OAuth 2.0的示例,请参见和-我这样做比使用Ruby OAuth2库麻烦更少。
// If we don't yet have access, immediately request it.
SF.Channel.Send(SF.PrepareRequestUserAuthorization());