2016-09-15 2 views
3

.NET Core, Identity Core 및 MVC Core를 사용하여 사용자 등록 시스템을 만들고 있습니다. 나는 사용자를 생성하고 데이터베이스에서 역할을 생성 할 수있다.userManager.AddToRoleAsync() - 오류 : 역할이 없습니다.

@using (Html.BeginForm("AddRoleToUser", "Roles")) 
{ 
    @Html.AntiForgeryToken() 
    @Html.ValidationSummary(true) 

    <p> 
     Username : @Html.DropDownList("UserName", (IEnumerable<SelectListItem>)ViewBag.Users, "Select ...") 
     Role Name: @Html.DropDownList("RoleName", (IEnumerable<SelectListItem>)ViewBag.Roles, "Select ...") 

    </p> 

    <input type="submit" value="Save" /> 
} 

이 드롭 다운 목록이 이미 데이터베이스에 존재하는 사용자 및 역할로 채워집니다 :

여기에 나를 사용자를 선택하고 추가 할 역할을 선택 할 수있는 뷰에있는 양식입니다. 그것들은 User을 선택하게하고 이미 만들었던 역할의 인 을 선택할 수있게 해줍니다. 예를 들어 "admin"이라는 이름의 역할을 가지고 있는데이 양식을 사용하면 "admin"이라는 문자열을 선택할 수 있습니다. 여기

는 사용자에게 역할을 추가 처리 작업입니다 ". 존재하지 않는"

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public async Task<IActionResult> AddRoleToUser(string UserName, string RoleName) 
    { 
     try 
     { 
      ApplicationUser user = _db.Users.Where(u => u.UserName.Equals(UserName, StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault(); 
      await _userManager.AddToRoleAsync(user, RoleName); 
      PrepopulateDropDownMenus(); 
      ViewBag.ResultMessage = "Role created successfully!"; 
      return View("Manage", "Roles"); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex); 
      return View("Manage"); 
     } 
    } 

이 동작은 사용자에게 역할을 추가하지, 그리고 예외가 "역할"ADMIN 읽기 내부 예외는 없다. 액션 매개 변수의 RoleName을 모두 대문자로 바꾸려고 시도했지만 역할을 찾지 못했습니다. 나는 또한 실패한 이름 대신 역할 ID를 사용하여 시도했다.

이 정확한 코드는 Identity 3.0 MVC 6을 사용하여이 응용 프로그램을 만들 때 작동했습니다. Identity Core로 이전 할 때 뭔가가 변경된 것처럼 보입니다.

의견이 있으십니까? 나는에 에 Startup.cs을 신원을 추가하는 방법은 다음과

private void PrepopulateDropDownMenus() 
    { 
     var rolesList = _db.Roles.OrderBy(r => r.Name).ToList().Select(rr => new SelectListItem { Value = rr.Name.ToString(), Text = rr.Name }).ToList(); 
     var usersList = _db.Users.OrderBy(u => u.UserName).ToList().Select(uu => new SelectListItem { Value = uu.UserName.ToString(), Text = uu.UserName }).ToList(); 
     ViewBag.Roles = rolesList; 
     ViewBag.Users = usersList; 
    } 

것 :

편집 여기

는 Viewbag 통해 RolesController에서 내가 드롭 다운 목록을 채우는 데 사용하고 코드입니다 ConfigureServices 방법 :

public void ConfigureServices(IServiceCollection services) 
    { 
     ... 
     services.AddEntityFramework() 
      .AddDbContext<ApplicationDbContext>(options => 
       options.UseSqlServer(Configuration["ConnectionStrings:DefaultConnection"])); 
     services.AddIdentity<ApplicationUser, IdentityRole>() 
      .AddEntityFrameworkStores<ApplicationDbContext>() 
      .AddDefaultTokenProviders(); 
    } 

다음은 경로입니다. 나는 아직 의견을 게시 할 수 없습니다 물어, 그래서

[HttpPost] 
    public IActionResult Create(string rolename) 
    { 
      _db.Roles.Add(new IdentityRole() 
      { 
       Name = rolename 
      }); 
      _db.SaveChanges(); 
      ViewBag.ResultMessage = "Role created successfully!"; 
      return RedirectToAction("Index"); 
    } 

답변

10

, 당신의 오류가 사용자 관리자가 존재하지 않는 말, 또는 않습니다 : N RolesController.cs 나는 데이터베이스에 새 역할을 만들 때 사용 역할가 존재하지 않습니까? 내 마지막에 코드를 복제하려고했는데 사용자가 존재하지 않으면 "사용자는 null이 될 수 없습니다"오류가 발생합니다. 그러나 역할이 존재하지 않으면 "역할 [역할]이 존재하지 않습니다"오류가 발생합니다.

이미 데이터베이스에 추가 된 역할이 있다고 가정합니다.

 // Add the Admin role to the database 
     IdentityResult roleResult; 
     bool adminRoleExists = await _roleManager.RoleExistsAsync("Admin"); 
     if (!adminRoleExists) 
     { 
      _logger.LogInformation("Adding Admin role"); 
      roleResult = await _roleManager.CreateAsync(new IdentityRole("Admin")); 
     } 

     // Select the user, and then add the admin role to the user 
     ApplicationUser user = await _userManager.FindByNameAsync("sysadmin"); 
     if (!await _userManager.IsInRoleAsync(user, "Admin")) 
     { 
      _logger.LogInformation("Adding sysadmin to Admin role"); 
      var userResult = await _userManager.AddToRoleAsync(user, "Admin"); 
     } 

편집을 당신이 지금 역할을 추가하는 방법은 잎 : 여기에 내가 내 종자 방법에 사용되는 일부 코드는 기본적으로 당신이 원하는 것을 뺀 뷰를 사용하여 그것을 할 즉 Role 테이블의 NormalizedName 필드는 사용자에게 역할을 추가하기 위해 프레임 워크에서 사용한다고 생각합니다.

var result = await _roleManager.CreateAsync(new IdentityRole(rolename)); 

을 또는이도 작동 할 수있다 (하지만이 하나를 테스트하지 않았습니다) : 대신 당신이 현재하고있는 일의 데이터베이스에 역할을 추가하려면 다음 중 하나를 시도

[HttpPost] 
public IActionResult Create(string rolename) 
{ 
     _db.Roles.Add(new IdentityRole() 
     { 
      Name = rolename, 
      NormalizedName = rolename.ToUpper() 
     }); 
     _db.SaveChanges(); 
     ViewBag.ResultMessage = "Role created successfully!"; 
     return RedirectToAction("Index"); 
} 
+0

감사합니다 그걸 잡기 위해서! 오류는 "역할 [역할]이 존재하지 않습니다"라고 표시됩니다. 내 질문을 편집했습니다. 이미 내 데이터베이스에 역할을 추가했습니다 (드롭 다운 목록은 "역할"테이블의 데이터로 채워짐). 답변에 포함 된 코드가 귀하에게 적합합니까? – jmk22

+0

그래,이 코드는 새/빈 데이터베이스를 시드하는 데 사용하는 실제 코드이지만 기본 사항은 동일해야합니다. 선택 목록을 채우는 코드를 게시 할 수 있습니까? 그리고 처음부터 데이터베이스에 역할을 어떻게 추가하고 있습니까? – FranksBrain

+0

그게 재미 있어요. 위 편집에서 코드를 추가했습니다. 나는 데이터베이스의'Add' 메쏘드로 컨트롤러의'Create' 액션에서 데이터베이스에 역할을 추가하고 있습니다. – jmk22

관련 문제