ASP.NET-Identität: Externe Ansprüche nach Autorisierung aktualisieren

Ich verwende ASP.NET Identity mit mehreren externen Anmeldeanbietern und muss das folgende Szenario behandeln:

1) Ein Benutzer meldet sich über einen externen Dienst an (sagen wir, es ist Facebook). Die Anwendung holt sich einige Informationen von Facebook (Vor- und Nachname, E-Mail-Adresse, Geburtsdatum usw.). Ansprüche, die diese Informationen enthalten, werden dem hinzugefügt Identität

2) Ich muss diese Informationen in der Anwendung Db für die folgenden Szenarien speichern:

Admin durchsucht die Liste der registrierten Benutzer

E-Mail-Abonnementdienst verwendet Vor- und Nachnamen

...

Die Frage lautet, ob der Benutzer sein / ihr Facebook-Profil aktualisieren wird (z. B. die E-Mail-Adresse ändern). In diesem Fall muss ich auch die Informationen in meiner Datenbank aktualisieren (ich speichere externe Ansprüche in der AspNetUserClaims-Tabelle). Eigentlich muss ich es jedes Mal aktualisieren, wenn ein externer Benutzer authentifiziert wird.

Hier ist der Code, wie es zum ersten Mal gespeichert wird:

Extended Claim class:

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

Anfang

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

Externer Login-Rückruf:

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

Erstellen eines Benutzers nach Bestätigung der externen Anmeldung (Auslassen eines anderen Codes):

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

Dies funktioniert einwandfrei, aber ich muss eingehende Anspruchswerte aktualisieren, nachdem ein Facebook-Nutzer zurückgekehrt ist. Was ist der wahre Weg, um mit einer solchen Situation umzugehen? Danke

Antworten auf die Frage(2)

Ihre Antwort auf die Frage