0

Web Api用のVisual Studioテンプレートに付属する個々のユーザーアカウントで既定の認証を使用しています。 Angular.jsのフロントエンドでapiを消費します。トークン認証を使用してユーザープロファイルを実装する方法

フロントエンドにユーザープロファイルを提供する「標準的な」方法は何ですか?

トークンを取得し、ユーザープロファイル(電子メール、名字、姓名)を別々のアクティビティにするか、またはトークンとトークンと少なくともロールと姓と名をUIに表示できるようにする必要がありますか?

authとASP.Net Web Api + Angular.jsの特定の情報のトークンを使用するアプリケーションのアーキテクチャ/フローに関する一般的なガイダンスを探しています。

答えて

0

これは私がそれを実装した方法です。

TL;「GIVENNAMEが」、「姓が」は既にそれがこの情報を格納するためにOKな場所だということを示唆しているが存在するので、私は、クレームを使用することにしました

DR。 私は主張を編集することが非常に厄介であることを発見しました。

詳細

ここに私の追加/ UpdateUser方法です。私はクレームが処理される方法が嫌いですが、私はより良い方法を見つけることができませんでした。

 [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(); 
      } 
     } 
関連する問題