Я пытаюсь получить пользовательские свойства, которые возвращаются в контексте OnAuthenticated и добавляются в качестве претензий в следующем примере: Как получить доступ к личной информации Facebook с помощью идентификатора ASP.NET( Owin)?
Я вижу, что данные, которые я ожидаю, возвращаются при входе в систему и добавляются в качестве претензии в Starup.Auth.cs. Но, когда я нахожусь в Контроллере учетных записей, единственные претензии, которые появляются в UserManager или UserStore, выдается ЛОКАЛЬНЫМ АВТОРИТЕМ. Никакие претензии не могут быть найдены для Facebook (или других внешних поставщиков). Где заканчиваются претензии, добавленные в контекст? (Я использую VS2013 RTM.)
Полный источник и живой сайт на Azure, связанный здесь: https://github.com/johndpalm/IdentityUserPropertiesSample/tree/VS2013rtm
Вот что у меня в Startup.Auth.cs:
var facebookOptions = new Microsoft.Owin.Security.Facebook.FacebookAuthenticationOptions()
{
AppId = ConfigurationManager.AppSettings.Get("FacebookAppId"),
AppSecret = ConfigurationManager.AppSettings.Get("FacebookAppSecret"),
Provider = new Microsoft.Owin.Security.Facebook.FacebookAuthenticationProvider()
{
OnAuthenticated = (context) =>
{
const string XmlSchemaString = "http://www.w3.org/2001/XMLSchema#string";
foreach (var x in context.User)
{
var claimType = string.Format("urn:facebook:{0}", x.Key);
string claimValue = x.Value.ToString();
if (!context.Identity.HasClaim(claimType, claimValue))
context.Identity.AddClaim(new System.Security.Claims.Claim(claimType, claimValue, XmlSchemaString, "Facebook"));
}
context.Identity.AddClaim(new System.Security.Claims.Claim("urn:facebook:access_token", context.AccessToken, XmlSchemaString, "Facebook"));
return Task.FromResult(0);
}
}
};
facebookOptions.Scope.Add("email");
app.UseFacebookAuthentication(facebookOptions);
Альтернативным способом захвата внешних свойств входа будет добавление отдельной заявки для токена доступа и заполнение ее свойствами:
const string XmlSchemaString = "http://www.w3.org/2001/XMLSchema#string";
var facebookOptions = new Microsoft.Owin.Security.Facebook.FacebookAuthenticationOptions
{
AppId = ConfigurationManager.AppSettings.Get("FacebookAppId"),
AppSecret = ConfigurationManager.AppSettings.Get("FacebookAppSecret"),
Provider = new Microsoft.Owin.Security.Facebook.FacebookAuthenticationProvider()
{
OnAuthenticated = (context) =>
{
var claim = new System.Security.Claims.Claim("urn:facebook:access_token", context.AccessToken, XmlSchemaString, "Facebook");
foreach (var x in context.User)
{
string key = string.Format("urn:facebook:{0}", x.Key);
string value = x.Value.ToString();
claim.Properties.Add(key, value);
}
context.Identity.AddClaim(claim);
return Task.FromResult(0);
}
}
};
ПРИМЕЧАНИЕ. Этот пример не работает: хотя было бы неплохо передать одно требование со свойствами. Внешний файл cookie, кажется, отмечает честь свойств претензий. Свойства становятся пустыми, когда они извлекаются позже из идентификатора.