ASP.NET Identity: обновление внешних утверждений после авторизации
Я использую ASP.NET Identity с несколькими внешними провайдерами входа, и мне нужно обработать следующий сценарий:
1) Пользователь входит в систему с помощью внешнего сервиса (скажем, это Facebook), приложение получает некоторую информацию из Facebook (имя и фамилия, адрес электронной почты, дата рождения и т. Д.). Заявки, содержащие эту информацию, добавляются к личности. ,
2) Мне нужно хранить эту информацию в приложении Db, для следующих сценариев:
Администратор просматривает список зарегистрированных пользователей
Служба электронной почты будет использовать имена и фамилии
...Вопрос в том, что если пользователь обновит свой профиль на Facebook (например, изменит адрес электронной почты) - в этом случае мне нужно обновить информацию и в моей базе данных (я сохраняю внешние заявки в таблице AspNetUserClaims). На самом деле мне нужно обновлять его каждый раз, когда внешний пользователь проходит проверку подлинности.
Вот код того, как он сохраняется в первый раз:
Класс расширенной заявки:
public class ApplicationUserClaim : IdentityUserClaim<Guid>
{
public string Issuer { get; set; }
public string ClaimValueType { get; set; }
}
Запускать:
var facebookOptions = new FacebookAuthenticationOptions {
AppId = "...",
AppSecret = "...",
Provider = new FacebookAuthenticationProvider {
OnAuthenticated = (context) => {
context.Identity.AddClaims(new[] {
new Claim("LastName", context.User["last_name"].ToString(), ClaimValueTypes.String, "Facebook"),
new Claim("FirstName", context.User["first_name"].ToString(), ClaimValueTypes.String, "Facebook"),
//...Other claims
});
}
}
};
facebookOptions.Scope.Add("email");
facebookOptions.Scope.Add("user_birthday");
app.UseFacebookAuthentication(facebookOptions);
AuthController
Внешний логин обратного вызова:
public ActionResult ExternalLogin(string returnUrl)
{
var loginInfo = authenticationManager.GetExternalLoginInfo();
//No user found - this is the first login with an external service
//Asking to confirm an external account
if(signInStatus == SignInStatus.Failure)
return View("ExternalLoginConfirmation", new ExternalLoginConfirmationViewModel { ... });
}
Создание пользователя после подтверждения внешнего входа (без использования другого кода):
public ActionResult ExternalLoginConfirmation(ExternalLoginConfirmationViewModel loginConfirmationViewModel)
{
var loginInfo = authenticationManager.GetExternalLoginInfo();
var user = new ApplicationUser();
user.Logins.Add(new RegisteredUserLogin {
LoginProvider = loginInfo.Login.LoginProvider,
ProviderKey = loginInfo.Login.ProviderKey
});
//Converting Claims added in OnAuthenticated callback to ApplicationClaim objects to store them in Db
foreach(var userInfoClaim in loginInfo.GetUserInfoClaims())
user.Claims.Add(ClaimsHelper.ToUserClaimObject(userInfoClaim));
userManager.Create(user);
}
Это работает нормально, но я застрял с обновлением значений входящих претензий после того, как пользователь Facebook возвращается. Каков истинный способ справиться с такой ситуацией? Спасибо.