如何使用令牌身份验证实现用户配置文件

时间:2016-06-20 10:13:37

标签: angularjs asp.net-web-api2 asp.net-identity asp.net-membership

我正在使用开箱即用的身份验证,其中包含用于Web Api的Visual Studio模板附带的个人用户帐户。我在Angular.js前端使用了api。

向前端提供用户个人资料的'规范'方式是什么?

获取令牌并获取用户配置文件(电子邮件,名字和姓氏,角色)单独的活动,或者/ Token是否应提供令牌以及至少角色以及可能名字和姓氏以便UI可以显示它?

我正在寻找有关使用令牌for auth以及ASP.Net Web Api + Angular.js特定信息的应用程序的架构/流程的一般指导。

1 个答案:

答案 0 :(得分:0)

记录这是我实现它的方式。

<强> TL; DR

我决定使用声明,因为&#39; GivenName&#39;,&#39; Surname&#39;已经存在,这表明它是存储此信息的好地方。 我发现编辑索赔非常尴尬。

<强>详情

这是我的Add / 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();
            }
        }