GetExternalLoginInfoAsync при авторизации через Facebook возвращает null

90
30 апреля 2021, 08:30

Я добавил авторизацию через facebook в Startup, решил уже туда все что можно запихать в попытках решить проблему:

 .AddFacebook(facebookOptions =>
                {
                    facebookOptions.AppId = Configuration["Authentication:Facebook:AppId"];
                    facebookOptions.AppSecret = Configuration["Authentication:Facebook:AppSecret"];
                    facebookOptions.SaveTokens = true;
                    facebookOptions.Scope.Add("public_profile");
                    facebookOptions.Scope.Add("email");
                    facebookOptions.Fields.Add("name");
                    facebookOptions.Fields.Add("email");
                    facebookOptions.Fields.Add("first_name");
                    facebookOptions.Fields.Add("last_name");
                    facebookOptions.ClaimActions.MapJsonKey(ClaimTypes.NameIdentifier, "id");
                    facebookOptions.ClaimActions.MapJsonSubKey("urn:facebook:age_range_min", "age_range", "min");
                    facebookOptions.ClaimActions.MapJsonSubKey("urn:facebook:age_range_max", "age_range", "max");
                    facebookOptions.ClaimActions.MapJsonKey(ClaimTypes.DateOfBirth, "birthday");
                    facebookOptions.ClaimActions.MapJsonKey(ClaimTypes.Email, "email");
                    facebookOptions.ClaimActions.MapJsonKey(ClaimTypes.Name, "name");
                    facebookOptions.ClaimActions.MapJsonKey(ClaimTypes.GivenName, "first_name");
                    facebookOptions.ClaimActions.MapJsonKey("urn:facebook:middle_name", "middle_name");
                    facebookOptions.ClaimActions.MapJsonKey(ClaimTypes.Surname, "last_name");
                    facebookOptions.ClaimActions.MapJsonKey(ClaimTypes.Gender, "gender");
                    facebookOptions.ClaimActions.MapJsonKey("urn:facebook:link", "link");
                    facebookOptions.ClaimActions.MapJsonSubKey("urn:facebook:location", "location", "name");
                    facebookOptions.ClaimActions.MapJsonKey(ClaimTypes.Locality, "locale");
                    facebookOptions.ClaimActions.MapJsonKey("urn:facebook:timezone", "timezone");

                })

В контролере добавил такой метод:

 public IActionResult SignIn(String provider)
        {
            var properties = new AuthenticationProperties
            {
                RedirectUri = Url.Action("FacebookLoginCallback",
                    new { returnUrl = "QQQQQQQQQQQ" })
            };
            return Challenge(properties, provider);
        }

При переходе по https://localhost:5002/api/Authentication?provider=Facebook происходит редирект на авторизацию в Facebook. И после ввода пароля попадает в метод FacebookLoginCallback:

public async Task<string> GoogleLoginCallback(string returnUrl)
        {
           var info = await AuthManager.GetExternalLoginInfoAsync();
           ...

Где info чтобы я не делал остается null. Я попробовал переписать метод GetExternalLoginInfoAsync таким образом:

 public virtual async Task<ExternalLoginInfo> GetExternalLoginInfoAsync(
            string expectedXsrf = null)
        {
            AuthenticateResult auth = await HttpContext.AuthenticateAsync(CookieAuthenticationDefaults.AuthenticationScheme);
            IDictionary<string, string> items = auth?.Properties?.Items;
            string providerKey = auth.Principal.FindFirstValue("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier");
            string provider = "Facebook";
            if (providerKey == null || provider == null)
                return (ExternalLoginInfo) null;
            return new ExternalLoginInfo(auth.Principal, provider, providerKey, (await AuthManager.GetExternalAuthenticationSchemesAsync()).FirstOrDefault<AuthenticationScheme>((Func<AuthenticationScheme, bool>) (p => p.Name == provider))?.DisplayName ?? provider)
            {
                AuthenticationTokens = auth.Properties.GetTokens()
            };
        }

Т. е. заменил this.Context.AuthenticateAsync(IdentityConstants.ExternalScheme);`на HttpContext.AuthenticateAsync(CookieAuthenticationDefaults.AuthenticationScheme); И напрямую написал provider. И о чудо мне стало хоть что-то возвращать. Но к сожалению не все. Никакой информации хотя бы о email или всего того что я описал в стартапе не вижу и не пойму как получить. Ясно что я чего-то не понимаю и делаю не так, но к сожалению информации в интернете подходящей так и не нашел, хотя и вопросов с подобным заголовками достаточно. Может кто сталкивался и сможет подсказать?

Answer 1

Все разрешилось переустановкой net core

READ ALSO
wpf dependency property add owner

wpf dependency property add owner

В книге Петцольда есть следующий пример:

110
Как записать консольный код AngleSharp в форме?

Как записать консольный код AngleSharp в форме?

На вебстранице показан код парсера в консолиХотелось бы научиться получать результат парсинга сайта в textbox формы

101