Внешний вход в систему с использованием Identity Server 3 - настройка заявки на имя от facebook

Я пытаюсь настроить сервер идентификации, чтобы иметь возможность войти в систему через Facebook. Все работает нормально, за исключением того, что я не могу получить какую-либо информацию о пользователе из facebook. Ожидается, что приложение mvc заявит имя и фамилию. Я добавил область в public_profile, но не получил ее обратно.

После многих исследований кажется, что мне может понадобиться настроить UserService для этого, но я не уверен, как это сделать.

Помощь будет принята с благодарностью.

Вот мой код для настройки внешних провайдеров в настройке приложения сервера идентификации:

private void ConfigureIdenityProviders (IAppBuilder app, string signInAsType)
    {

        var facebookOptions = new Microsoft.Owin.Security.Facebook.FacebookAuthenticationOptions
        {
            AuthenticationType = "Facebook",
            Caption = "Sign in with Facebook",
            SignInAsAuthenticationType = signInAsType,
            AppId = "xxxxxxxxxxxx",
            AppSecret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",



            Provider = new Microsoft.Owin.Security.Facebook.FacebookAuthenticationProvider()
            {
                OnAuthenticated =  (context) =>
                {

                    // Problem here - there is no last_name returned
                       JToken lastname;
                    if (context.User.TryGetValue("last_name", out lastname))
                    {
                        context.Identity.AddClaim(new System.Security.Claims.Claim(IdentityServer3.Core.Constants.ClaimTypes.FamilyName, lastname.ToString()));
                    }

                    context.Identity.AddClaim(new System.Security.Claims.Claim("role", "Guest"));

                    return Task.FromResult(0);

                }

            }
        };

         facebookOptions.Scope.Add("public_profile");
        facebookOptions.Scope.Add("email");


        app.UseFacebookAuthentication(facebookOptions);

    }

person Tim Long    schedule 19.04.2016    source источник


Ответы (3)


Любые претензии, которые вы получите от Facebook, будут переданы методу AuthenticateExternal вашей пользовательской службы. В этот момент они являются вашими претензиями на то, чтобы делать с ними все, что вы хотите.

Если вы не получаете требуемые утверждения от Facebook, я бы предложил создать отдельное приложение MVC, чтобы сначала решить эту проблему.

person Brock Allen    schedule 20.04.2016

Я только что использовал график facebook, чтобы получить профиль пользователя.

Пользовательская служба может быть другим способом сделать это, но это работает для меня.

using (var client = new HttpClient())
                    {
                        var result = client.GetAsync("https://graph.facebook.com/me?fields=first_name,last_name&access_token=" + context.AccessToken).Result;


                        if (result.IsSuccessStatusCode)
                        {
                            var userInformation = result.Content.ReadAsStringAsync().Result;
                            var fbUser = JsonConvert.DeserializeObject<FacebookUser>(userInformation);
                            context.Identity.AddClaim(new System.Security.Claims.Claim(IdentityServer3.Core.Constants.ClaimTypes.GivenName, fbUser.first_name));
                            context.Identity.AddClaim(new System.Security.Claims.Claim(IdentityServer3.Core.Constants.ClaimTypes.FamilyName, fbUser.last_name));
                            context.Identity.AddClaim(new System.Security.Claims.Claim("role", "Guest"));
                        }

                    }
person Tim Long    schedule 20.04.2016

Вы не получите токен доступа от FB, если не измените своего провайдера следующим образом.

OnAuthenticated = context =>
               {
context.Identity.AddClaim(new System.Security.Claims.Claim("FacebookAccessToken", context.AccessToken));
return Task.FromResult(true);
  }

После того, как вы получите токен, вызовите fb с токеном и получите заданное_имя.

person Rajat    schedule 22.04.2016