2014-01-12 89 views
3

我有一個問題,我是新來的身份,但我仍然想知道什麼是分配角色給用戶的正確方式,當他正在註冊?正確設置用戶在註冊身份時的角色

我這裏有一個代碼:

[HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    public async Task<ActionResult> Register(RegisterViewModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      var user = new ApplicationUser() { UserName = model.UserName }; 

      RoleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext())); 
      IdentityRole role = new IdentityRole("Admin"); 
      await RoleManager.CreateAsync(role); 

      // Store Gender as Claim 
      user.Claims.Add(new IdentityUserClaim() { ClaimType = ClaimTypes.Gender, ClaimValue = "Male" }); 
      //user.Roles.Add(new IdentityUserRole() { RoleId=role.Id, UserId=user.Id }); 
      var result = await UserManager.CreateAsync(user, model.Password); 
      if (result.Succeeded) 
      { 
       //await UserManager.AddToRoleAsync(user.Id, "Admin"); 

       await SignInAsync(user, isPersistent: false); 
       return RedirectToAction("Index", "Home"); 
      } 
      else 
      { 
       AddErrors(result); 
      } 
     } 

     // If we got this far, something failed, redisplay form 
     return View(model); 
    } 

這只是一個測試代碼,但基本上如果我使用方法UserManager.AddToROleAsync(...)它的工作原理,但是,用戶以後就只會發生補充說,所以基本上我做了兩次往返數據庫。

我試着用user.Roles.Add(...)來做,但運行時出現錯誤。

所以我的問題是什麼是最有效和最正確的做法呢?

回答

2

我不知道有沒有更好的方法。我通常採用與你一樣的方式,首先創建角色(如果它不存在),然後創建用戶,並作爲將用戶添加到角色的最後一步。

要使用user.Roles.Add(...),角色必須存在。原因是數據庫(在這種情況下爲實體框架和SQL Server)。當尋找在身份數據庫接近,你會看到有通過有用戶IDAspNetUserRolesAspNetRolesAspNetUsers表之間的關係和角色ID作爲重點。這意味着當用戶還不存在時,不能將用戶添加到角色(反之亦然)。所以在我看來,你必須做兩次往返(如果你不直接在上下文中工作)。

1

這工作正常(Asp.Net核心身份):

var role = await this.roleManager.FindByNameAsync("Admin"); 
var user = new ApplicationUser { UserName = model.Email, Email = model.Email }; 
var userRole = new IdentityUserRole<int> { 
      RoleId = role.Id, 
     }; 
user.Roles.Add(userRole); 

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