it-swarm.com.de

Erstellen eines Benutzers und Abrufen der neu erstellten ID mit ASP.NET-Identität

Ich bin neu im ASP.NET Identity-Framework und versuche, einige Dinge zu tun, die ich im älteren FormsAuthentication-Framework gemacht habe.

Ich möchte einem Administrator erlauben, einen neuen Benutzer mithilfe der vorhandenen Registeransicht (oder einer ähnlichen Ansicht) in der App zu erstellen. Sobald dies abgeschlossen ist, möchte ich diesen Benutzer relational (möglicherweise mithilfe der generierten ID) mit anderen Bereichen des Systems verknüpfen.

Wie erhalte ich Zugriff auf die ID, die beim Aufrufen von UserManager.CreateAsync () generiert wird?

BEARBEITEN: Ich möchte, dass vorhandene Benutzer mit "administrativen" Rollen Benutzer innerhalb des Systems in einem Benutzerverwaltungsbereich erstellen. Die Antworten bis jetzt haben erklärt, wie man die ID für den "aktuellen" Benutzer erhält, was ich nicht suche.

25
FrankO

Wenn Sie die Variable IdentityUser oder eine von IdentityUser erben Klasse verwenden, wird das Modell mit einem Attribut UserId erstellt. Wenn Sie den folgenden Code verwenden und den Benutzer an die Methode übergeben, wird die ID aufgefüllt.

var user = model.GetUser();
var result = await UserManager.CreateAsync(user, model.Password);

if (result.Succeeded)
    result = UserManager.AddToRole(user.Id, "User");

Die model.GetUser() gibt ein Objekt der ApplicationUser oder IdentityUser zurück.

public ApplicationUser GetUser()
{
    var user = new ApplicationUser
    {
        UserName = UserName,
        FirstName = FirstName,
        LastName = LastName,
        Email = Email,
        ...
    };

    return user;
}
21

Die akzeptierte Antwort war mir nicht klar, also dachte ich, ich würde dies teilen.

Wenn Sie sich die source für die IdentityUser Klasse anschauen, finden Sie Folgendes.

public class IdentityUser : IdentityUser<string, IdentityUserLogin, IdentityUserRole, IdentityUserClaim>, IUser, IUser<string>
{
    /// <summary>
    ///     Constructor which creates a new Guid for the Id
    /// </summary>
    public IdentityUser()
    {
        this.Id = Guid.NewGuid().ToString();
    }
    ... code omitted
}

Wie Sie sehen, generiert der Konstruktor beim Erstellen einer neuen IdentityUser-Instanz ein neues GUID und füllt das Id-Feld auf.

Das heißt, wenn Sie eine neue Instanz einer abgeleiteten Klasse wie ApplicationUser erstellen, wird automatisch eine neue ID für Sie generiert.

Nachdem Sie überprüft haben, ob der Benutzer erfolgreich hinzugefügt wurde, können Sie die ID in der Klasse ApplicationUser für Ihre Datenzuordnung sicher verwenden. 

Beispiel.

var user = new ApplicationUser
{
    UserName = "franko",
    FirstName = "Frank",
    LastName = "Ouimette",
    Email = "[email protected]"
};

var result = await UserManager.CreateAsync(user, model.Password);

if (result.Succeeded){
    result = UserManager.AddToRole(user.Id, "User");

    // User added successfully, you can safely use the Id now.
    var id = user.Id;

}
12
mezmi

Was für mich funktionierte, war etwas anderes: 

var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context));
var user = new ApplicationUser() { Email = "[email protected]", UserName = "[email protected]" };
var result = manager.Create(user, "TestPass44!");

if (result.Succeeded)
{
    string newId = user.Id;
}
6

Das Identity-Framework wurde um einige Erweiterungsmethoden erweitert, einschließlich der folgenden:

public static string GetUserId(this IIdentity identity);

Nach dem Anmelden sollten Sie die ID leicht genug abrufen können:

await SignInAsync(user, isPersistent: false);
var id = this.User.Identity.GetUserId()
4
Mister Epic

Dieser Thread ist bereits einige Jahre alt, aber ich bin auf dieses Problem gestoßen und musste nach einer anderen Lösung suchen, da ich nicht die angegebene Variable Guids, sondern eine von der Datenbank bereitgestellte Standard-Integer-ID (automatisch inkrementierter Index) verwende.

Das Problem, das ich hatte, war, dass das Benutzerobjekt bei der Erstellung des Benutzers mit UserManager.CreateAsync nicht mit der ID aktualisiert wurde. Ich habe dann ein zugehöriges Objekt für diesen Benutzer erstellt. Da die ID nicht aktualisiert wurde, hat Entity Framework versucht, den Benutzer ein anderes Mal in der Datenbank zu speichern, was zu einer Verletzung des Primärschlüssels führte.

Um das Problem zu lösen, musste ich das Benutzerobjekt wie folgt lesen/aktualisieren:

var user = new User
{
    UserName = UserName,
    FirstName = FirstName,
    LastName = LastName,
    Email = Email,
    ...
};

var result = await UserManager.CreateAsync(user, model.Password);

// At this point, the user has been created, but the ID not set

// Read the full user record from the database
user = db.Users.Where(u => u.Email == user.Email).FirstOrDefault();

// At this point, the user has the correct ID set, we are good to go...
0
embee