Только с помощью конечной точки WASN» t достаточно, и оказывается ненужным с текущей OWIN Facebook lib, 3.1.0 - теперь вы можете указать поля в параметрах, которые вы передаете.
Мне пришлось использовать собственный поставщик аутентификации, который справляется с проблемой в библиотеке OWIN Facebook, где Facebook возвращает поля, но OWIN lib не может разобрать и собрать их для вас. Я подозреваю, что это связано с тем, что lib был спроектирован таким образом, что вы делаете заявку, а затем возвращаете ответ на этот запрос; но если вы просто называете поле, по какой-то причине он не разбирает это вообще.
В Startup.Auth:.
var facebook = new FacebookAuthenticationOptions
{
Provider = Brass9.OwinVisitor.Auth.Facebook.
FirstLastNameFacebookAuthenticationProvider.SplitFirstLastName(),
#if DEBUG
AppId = //
AppSecret = //
#else
AppId = //
AppSecret = //
#endif
};
//id,name,email,first_name,last_name
var fbScope = facebook.Scope;
fbScope.Add("email");
//fbScope.Add("first_name"); // Uncommenting this line will break auth
facebook.Fields.Add("id");
facebook.Fields.Add("email");
facebook.Fields.Add("name");
facebook.Fields.Add("first_name");
facebook.Fields.Add("last_name");
app.UseFacebookAuthentication(facebook);
Так, до сих пор я использовал новые варианты Owin Fields указать идентификатор, адрес электронной почты, имя, first_name, last_name - вместо прохождения пользовательских конечных точек в I Также был указан пользовательский AuthenticationProvider. Вот оно:
namespace Brass9.OwinVisitor.Auth.Facebook
{
public static class FirstLastNameFacebookAuthenticationProvider
{
public static FacebookAuthenticationProvider SplitFirstLastName()
{
return new FacebookAuthenticationProvider
{
OnAuthenticated = async context =>
{
context.Identity.AddClaim(new System.Security.Claims.Claim(
"FacebookAccessToken", context.AccessToken));
foreach (var claim in context.User)
{
var claimType = string.Format("urn:facebook:{0}", claim.Key);
string claimValue = claim.Value.ToString();
if (!context.Identity.HasClaim(claimType, claimValue))
context.Identity.AddClaim(new System.Security.Claims.Claim(
claimType, claimValue, "XmlSchemaString", "Facebook"));
}
}
};
}
}
}
Это делает для отказа Owin Lib, чтобы разобрать эти значения, осаждение их в качестве требований в объекте пользователя loginInfo.
Наконец, для удобства, я использую последний класс, чтобы получить при этих значениях в каноническом образе через провайдер, так как разные поставщики предлагают первое и последнее имя, используя различные схемы:
namespace Brass9.OwinVisitor.Auth
{
public class ReducedClaims
{
protected Dictionary<string, string> claims;
public ReducedClaims(IEnumerable<System.Security.Claims.Claim> claims)
{
var _claims = claims.ToArray();
this.claims = new Dictionary<string, string>(_claims.Length);
foreach(var claim in _claims)
{
this.claims.Add(claim.Type, claim.Value);
}
}
public ReducedClaims(ExternalLoginInfo loginInfo)
: this(loginInfo.ExternalIdentity.Claims)
{}
//http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname
//http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname
protected string chainValue(params string[] keys)
{
string val = null;
foreach(var key in keys)
{
if (claims.TryGetValue(key, out val))
return val;
}
return val;
}
// TODO: Instead detect which service it is then use the proper string instead of just milling through guesses?
public string FirstName { get { return chainValue(
"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname", // Google
"urn:facebook:first_name" // Facebook
); } }
public string LastName { get { return chainValue(
"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname", // Google
"urn:facebook:last_name" // Facebook
); } }
}
}
Что вы можете позвонить например:
var reducedClaims = new ReducedClaims(loginInfo.ExternalIdentity.Claims);
var firstName = reducedClaims.FirstName;
var lastName = reducedClaims.LastName;
спасибо за ваше время, я применил эти изменения еще не успех – usman
не работает для меня в апи исследователя: https://developers.facebook.com/tools/explorer/?method=GET&path=me% 3Ffields% 3Dname% 2Cfirst_name% 2Clast_name & version = v2.5 – luschn
Спасибо, внесли изменения в мой код, он решил мою проблему, – usman