我正在尝试使用OAuth从我的ASP.NET MVC C#应用程序对FreshBooks API进行身份验证。这是我到目前为止的内容:

我正在使用DotNetOpenAuth这是我在 Controller 操作中拥有的代码

if (TokenManager != null)
{
    ServiceProviderDescription provider = new ServiceProviderDescription();
    provider.ProtocolVersion = ProtocolVersion.V10a;
    provider.AccessTokenEndpoint = new MessageReceivingEndpoint     ("https://myfbid.freshbooks.com/oauth/oauth_access.php", DotNetOpenAuth.Messaging.HttpDeliveryMethods.PostRequest);
    provider.RequestTokenEndpoint = new DotNetOpenAuth.Messaging.MessageReceivingEndpoint("https://myfbid.freshbooks.com/oauth/oauth_request.php", DotNetOpenAuth.Messaging.HttpDeliveryMethods.PostRequest);
    provider.UserAuthorizationEndpoint = new DotNetOpenAuth.Messaging.MessageReceivingEndpoint("https://myfbid.freshbooks.com/oauth/oauth_authorize.php", DotNetOpenAuth.Messaging.HttpDeliveryMethods.GetRequest);
    provider.TamperProtectionElements = new ITamperProtectionChannelBindingElement[] { new HmacSha1SigningBindingElement() };

    var consumer = new WebConsumer(provider, TokenManager);

    var response = consumer.ProcessUserAuthorization();
    if (response != null)
    {
        this.AccessToken = response.AccessToken;
    }
    else
    {
        // we need to request authorization
        consumer.Channel.Send(consumer.PrepareRequestUserAuthorization(
            new Uri("http://localhost:9876/home/testoauth/"), null, null));
    }
}

TokenManager与DotNetOpenAuth示例所提供的类相同,我已经设置了FreshBooks给我的消费者 secret 。

consumer.Channel.Send(consumer.PrepareRequestUserAuthorization(...))上,我有以下异常:



我这样做正确吗?基于FreshBooks文档和应该正确运行的DotNetOpenAuth示例。

是否有更简单的OAuth身份验证方法,因为DotNetOpenAuth对于仅使用OAuth身份验证而言有点庞大?

最佳答案

如果要使用DotNetOpenAuth,则需要确保:

  • 您使用签名方法“PLAINTEXT”
  • ,并使用PlaintextSigningBindingElement作为TamperProtectionElements

  • 像这样的东西对我有用:
    public static readonly ServiceProviderDescription ServiceDescription = new ServiceProviderDescription
    {
        ProtocolVersion = ProtocolVersion.V10a,
        RequestTokenEndpoint = new MessageReceivingEndpoint(oAuthBase + "/oauth_request.php", HttpDeliveryMethods.PostRequest),
        UserAuthorizationEndpoint = new MessageReceivingEndpoint(oAuthBase + "/oauth_authorize.php", HttpDeliveryMethods.GetRequest | HttpDeliveryMethods.AuthorizationHeaderRequest),
        AccessTokenEndpoint = new MessageReceivingEndpoint(oAuthBase + "/oauth_access.php", HttpDeliveryMethods.PostRequest | HttpDeliveryMethods.AuthorizationHeaderRequest),
        TamperProtectionElements = new ITamperProtectionChannelBindingElement[] { new PlaintextSigningBindingElement() }
    };
    
    public static void RequestAuthorization(WebConsumer consumer)
    {
        if (consumer == null)
        {
            throw new ArgumentNullException("consumer");
        }
    
        var extraParameters = new Dictionary<string, string> {
            { "oauth_signature_method", "PLAINTEXT" },
        };
        Uri callback = Util.GetCallbackUrlFromContext();
        var request = consumer.PrepareRequestUserAuthorization(callback, extraParameters, null);
        consumer.Channel.Send(request);
    }
    

    关于c# - 通过DotNetOpenAuth对FreshBooks进行身份验证,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4974056/

    10-10 19:42