带有DotNetOpenAuth 4.1.0.12182的Facebook

带有DotNetOpenAuth 4.1.0.12182的Facebook,facebook,oauth-2.0,dotnetopenauth,Facebook,Oauth 2.0,Dotnetopenauth,我正在尝试使用DotNetOpenAuth 4.1.0.12182创建Facebook和Windows LiveId的用户登录 但是,下载中的示例使用了当前版本中不存在的DotNetOpenAuth.ApplicationBlock和DotNetOpenAuth.ApplicationBlock.Facebook 取而代之的是DotNetOpenAuth.AspNet.Clients名称空间,其中包括FacebookClient和WindowsLiveClient——但是我找不到任何关于如何使用

我正在尝试使用DotNetOpenAuth 4.1.0.12182创建Facebook和Windows LiveId的用户登录

但是,下载中的示例使用了当前版本中不存在的
DotNetOpenAuth.ApplicationBlock
DotNetOpenAuth.ApplicationBlock.Facebook

取而代之的是
DotNetOpenAuth.AspNet.Clients
名称空间,其中包括
FacebookClient
WindowsLiveClient
——但是我找不到任何关于如何使用这些名称空间的示例


是否存在任何示例或文档?

您需要使用DNOA的ctp版本3.5。版本4+是为了配合OAuth 2的最新版本,然后Facebook使用

您可以在所有者GitHub上找到它:

我已经能够让DNOA版本4.1.0.12182、.Net 3.5和Facebook通过创建从DotNetOpenAuth.OAuth2.WebServerClient派生的FacebookAuthClient相互协作。我发现的一个小问题是,如果您使用的是基于cookie的会话,那么您必须在使用OAuth功能之前访问该会话。从我可以看出这是因为DNOA使用会话ID作为状态参数,如果从未访问过会话,它可以在请求之间更改。当从Facebook返回响应时,这将导致状态参数不匹配错误

FacebookAuthClient:

public class FacebookAuthClient : DotNetOpenAuth.OAuth2.WebServerClient
{
    private static readonly DotNetOpenAuth.OAuth2.AuthorizationServerDescription Description = new DotNetOpenAuth.OAuth2.AuthorizationServerDescription
    {
        TokenEndpoint = new Uri("https://graph.facebook.com/oauth/access_token"),
        AuthorzationEndpoint = new Uri("https://graph.facebook.com/oauth/authorize")    
    };

    public static readonly string [] ScopeNeeded = { "publish_stream" };

    public FacebookAuthClient()
       : base(Description)

    {
    }
}
Facebook.aspx.cs:

public partial class FacebookPage : System.Web.UI.Page
{
    private FacebookAuthClient _client = new FacebookAuthClient
    {
        ClientIdentifier = ConfigurationManager.AppSettings["FBClientId"], //The FB app's Id
        ClientCredentialApplicator = DotNetOpenAuth.OAuth2.ClientCredentialApplicator.PostParameter(ConfigurationManager.AppSettings["FBClientSecret"]) // The FB app's secret
    }
    protected void Page_Load(object sender, EventArgs e)
    {
        DotNetOpenAuth.OAuth2.IAuthorizationState auth = _client.ProcessUserAuthorization();
        if (_auth == null)
        {
            // Kick off authorization request with the required scope info
            client.RequestUserAuthorization(FacebookAuthClient.ScopeNeeded);
        }
    }
}
这只是一个测试应用程序,因此没有错误处理,但它似乎可以工作

编辑 我使用DotNetOpenAuth(统一)NuGet包来实现所有这些

编辑
添加了缺失。创建ClientCredentialApplicationor的后参数调用。

如果是这样,那么库中为什么存在
FacebookClient
类?我与DNOA的创建者对此进行了长时间的讨论,他指出,这是因为当Facebook决定更新最新的草稿时,它可能会在以后工作。在此之前,除了自己处理请求之外,没有其他解决方案。如果DNOA上有关于此(其他)问题的突出常见问题解答,那将非常有用。DNOA大大简化了OpenID/OAuth的使用——但像这样的问题带来了新的问题感谢分享Josh——我只是希望它没有涉及到如此慷慨的行为来让这一切变得明朗!(不是针对您或任何人)
DotNetOpenAuth.OAuth2.ClientCredentialApplicator
说它是一种类型,但我可以从中使用
.NetworkCredential
。但是我得到了错误400 bad request.BrunoLM-感谢您指出我已经用DotNetOpenAuth.OAuth2.ClientCredentialApplicator.PostParameter更新了代码。请注意缺少的后参数部分