Заявленный идентификатор DotNetOpenAuth от Facebook никогда не бывает прежним - PullRequest
2 голосов
/ 23 сентября 2011

Я использую DotNetOpenAuth v3.5.0.10357, и каждый раз, когда пользователь проходит аутентификацию на Facebook, я получаю другой заявленный идентификатор.Токен выглядит зашифрованным, поэтому я предполагаю, что DNOA каким-то образом шифрует токен вместе с истечением срока действия.Кто-нибудь может это подтвердить?Или я использую это неправильно:

    public ActionResult FacebookLogOn(string returnUrl)
    {
        IAuthorizationState authorization = m_FacebookClient.ProcessUserAuthorization();
        if (authorization == null)
        {
            // Kick off authorization request
            return new FacebookAuthenticationResult(m_FacebookClient, returnUrl);
        }
        else
        {
            // TODO: can we check response status codes to see if request was successful?
            var baseTokenUrl = "https://graph.facebook.com/me?access_token=";
            var requestUrl = String.Format("{0}{1}", baseTokenUrl, Uri.EscapeDataString(authorization.AccessToken));
            var claimedIdentifier = String.Format("{0}{1}", baseTokenUrl, authorization.AccessToken.Split('|')[0]);

            var request = WebRequest.Create(requestUrl);
            using (var response = request.GetResponse())
            {
                using (var responseStream = response.GetResponseStream())
                {
                    var graph = FacebookGraph.Deserialize(responseStream);
                    var token = RelyingPartyLogic.User.ProcessUserLogin(graph, claimedIdentifier);
                    this.FormsAuth.SignIn(token.ClaimedIdentifier, false);
                }
            }

            return RedirectAfterLogin(returnUrl);
        }
    }

Вот код для FacebookAuthenticationResult:

    public class FacebookAuthenticationResult : ActionResult
{
    private FacebookClient m_Client;
    private OutgoingWebResponse m_Response;

    public FacebookAuthenticationResult(FacebookClient client, string returnUrl)
    {
        m_Client = client;

        var authorizationState = new AuthorizationState(new String[] { "email" });
        if (!String.IsNullOrEmpty(returnUrl))
        {
            var currentUri = HttpContext.Current.Request.Url;
            var path = HttpUtility.UrlDecode(returnUrl);

            authorizationState.Callback = new Uri(String.Format("{0}?returnUrl={1}", currentUri.AbsoluteUri, path));

        }
        m_Response = m_Client.PrepareRequestUserAuthorization(authorizationState);
    }

    public FacebookAuthenticationResult(FacebookClient client) : this(client, null) { }

    public override void ExecuteResult(ControllerContext context)
    {
        m_Response.Send();
    }
}

Кроме того, я использую проект RelyingPartyLogic, включенный в примеры DNOA, но я добавил перегрузкудля ProcessUserLogin, характерного для facebook:

    public static AuthenticationToken ProcessUserLogin(FacebookGraph claim, string claimedIdentifier)
    {
        string name = claim.Name;
        string email = claim.Email;
        if (String.IsNullOrEmpty(name))
            name = String.Format("{0} {1}", claim.FirstName, claim.LastName).TrimEnd();
        return ProcessUserLogin(claimedIdentifier, "http://facebook.com", email, name, claim.Verified);
    }

Похоже, что FacebookClient наследуется от WebServerClient, но я искал источник на GitHub и не вижу ветви или тега, связанного (или, по крайней мере, не помеченного) с соответствующей версией v3.5.

Ответы [ 2 ]

5 голосов
/ 24 сентября 2011

Facebook не поддерживает OpenID. Заявленный идентификатор - это термин OpenID. Facebook использует OAuth 2.0, поэтому вы смешиваете OpenID и OAuth.

Facebook каждый раз отправляет разный токен доступа, что является нормальным для протокола OAuth. Вы должны использовать маркер доступа, чтобы запрашивать у Facebook идентификатор пользователя, который является постоянным при каждом посещении.

0 голосов
/ 23 сентября 2011

Я думаю, вам нужно добавить разрешение offline_access в запрос токена, см. https://developers.facebook.com/docs/reference/api/permissions/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...