0

Ich benutze Out-of-the-Box-Authentifizierung mit individuellen Benutzerkonten, die mit der Visual Studio Vorlage für Web API geliefert wird. Ich konsumiere die API in einem Angular.js Frontend.So implementieren Sie Benutzerprofil mit Token-Auth

Was ist der "kanonische" Weg, um dem Frontend ein Benutzerprofil zu geben?

Erhalte das Token und das Abrufen des Benutzerprofils (E-Mail, Vor- und Nachname, Rollen) separate Aktivitäten oder sollte/Token das Token und mindestens die Rollen und vielleicht Vor- und Nachname bereitstellen, damit die UI es anzeigen kann?

Ich bin auf der Suche nach einer allgemeinen Anleitung über Architektur/Flow für Apps mit einem Token für Auth sowie ASP.Net Web Api + Angular.js spezifischen Informationen.

Antwort

0

Für den Rekord ist, wie ich es implementiert habe.

TL; DR

ich entschieden Ansprüche zu verwenden, weil ‚Given‘, ‚Name‘ ist bereits vorhanden was darauf schließen lässt, dass es ein OK Ort ist diese Info zu speichern. Ich fand es sehr umständlich, Ansprüche zu bearbeiten.

Einzelheiten

Hier ist mein Add/Updateuser-Methode. Ich hasse die Art und Weise, wie Ansprüche behandelt werden, aber ich konnte keinen besseren Weg finden.

 [HttpPost] 
     [Authorize(Roles = "admin")] 
     public async Task<IHttpActionResult> Post(AccountModelDTO model) 
     { 
      if (!ModelState.IsValid) 
      { 
       return BadRequest(ModelState); 
      } 

      using (var transaction = Request.GetOwinContext().Get<ApplicationDbContext>().Database.BeginTransaction()) 
      { 
       ApplicationUser user; 
       if(string.IsNullOrEmpty(model.Id)) 
       {//Add user 
        user = new ApplicationUser() { UserName = model.Email, Email = model.Email }; 

        IdentityResult resultAdd = await UserManager.CreateAsync(user); //Note, that CreateAsync this sets user.Id 
        if (!resultAdd.Succeeded) 
        { 
         return GetErrorResult(resultAdd); 
        } 
       } else 
       {//Update user 
        user = await UserManager.FindByIdAsync(model.Id); 
        if(user == null) 
        { 
         throw new HttpResponseException(Request.CreateResponse(System.Net.HttpStatusCode.BadRequest, "Unknown id")); 
        } 

        user.UserName = model.Email; 
        user.Email = model.Email; 

        //Remove existing claims 
        var claims = user.Claims.Where(c=>c.ClaimType == ClaimTypes.GivenName).ToList(); 
        foreach(var claim in claims) 
        { 
         await UserManager.RemoveClaimAsync(user.Id, new Claim(ClaimTypes.GivenName, claim.ClaimValue)); 
        } 

        claims = user.Claims.Where(c => c.ClaimType == ClaimTypes.Surname).ToList(); 
        foreach (var claim in claims) 
        { 
         await UserManager.RemoveClaimAsync(user.Id, new Claim(ClaimTypes.Surname, claim.ClaimValue)); 
        } 

        claims = user.Claims.Where(c => c.ClaimType == ClaimTypes.Role).ToList(); 
        foreach (var claim in claims) 
        { 
         await UserManager.RemoveClaimAsync(user.Id, new Claim(ClaimTypes.Role, claim.ClaimValue)); 
        } 
       } 

       var result = await UserManager.AddClaimAsync(user.Id, new Claim(ClaimTypes.GivenName, model.FirstName)); 
       if (!result.Succeeded) 
       { 
        return GetErrorResult(result); 
       } 

       await UserManager.AddClaimAsync(user.Id, new Claim(ClaimTypes.Surname, model.LastName)); 
       if (!result.Succeeded) 
       { 
        return GetErrorResult(result); 
       } 

       foreach (var role in model.Roles) 
       { 
        result = await UserManager.AddClaimAsync(user.Id, new Claim(ClaimTypes.Role, role)); 
       } 
       if (!result.Succeeded) 
       { 
        return GetErrorResult(result); 
       } 

       transaction.Commit(); 
       return Ok(); 
      } 
     } 
Verwandte Themen