Identidad ASP.NET: Actualice los reclamos externos después de la autorización

Estoy usando ASP.NET Identity con varios proveedores de inicio de sesión externos y necesito manejar el siguiente escenario:

1) Un usuario inicia sesión utilizando un servicio externo (digamos que es Facebook), la aplicación toma alguna información de Facebook (nombre y apellido, correo electrónico, fecha de nacimiento, etc.) Las reclamaciones que contienen esta información se agregan a la identidad .

2) Necesito almacenar esta información en la aplicación Db, para los siguientes escenarios:

El administrador examina la lista de usuarios registrados

El servicio de suscripción por correo electrónico utilizará nombres y apellidos

...

La pregunta es si el usuario actualizará su perfil de Facebook (p. Ej., Cambiará la dirección de correo electrónico); en este caso, también necesito actualizar la información en mi base de datos (almaceno las reclamaciones externas en la tabla AspNetUserClaims). En realidad, necesito actualizarlo cada vez que un usuario externo se autentica.

Aquí está el código de cómo se guarda por primera vez:

Clase de reclamo extendido:

public class ApplicationUserClaim : IdentityUserClaim<Guid>
{
    public string Issuer { get; set; }
    public string ClaimValueType { get; set; }
}

Puesta en marcha:

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

Devolución de llamada de inicio de sesión externo:

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 { ... });    
}

Crear un usuario después de la confirmación de inicio de sesión externo (omitiendo otro código):

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);
}

Esto funciona bien, pero estoy atascado con la actualización de los valores de reclamo entrantes después de que un usuario de Facebook regresa. ¿Cuál es la verdadera forma de manejar tal situación? Gracias.

Respuestas a la pregunta(1)

Su respuesta a la pregunta