Я добавил авторизацию через 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 или всего того что я описал в стартапе не вижу и не пойму как получить. Ясно что я чего-то не понимаю и делаю не так, но к сожалению информации в интернете подходящей так и не нашел, хотя и вопросов с подобным заголовками достаточно. Может кто сталкивался и сможет подсказать?
Все разрешилось переустановкой net core
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
На вебстранице показан код парсера в консолиХотелось бы научиться получать результат парсинга сайта в textbox формы