2017-06-29 5 views
0

Also habe ich Identity für mein Kernprojekt implementiert. Ich habe meine Registrierung erfolgreich abgeschlossen. Beim Versuch, mich mit dem _signInManager.PasswordSignInAsync anzumelden, erhalte ich die Ausnahme. Ungültiger Objektname 'AspNetRoleClaims'.Ungültiger Objektname 'AspNetRoleClaims' Ausnahme beim Einloggen

Ich weiß, das ist, weil die AspNetRoleClaims-Tabelle nicht in meiner Datenbank vorhanden ist. Aber ich kenne weder die Struktur dieser Tabelle, noch weiß ich, wie man sie automatisch erstellt, wie in mvc.

Kann mir jemand erklären, warum diese Tabelle verwendet wird. Oder zumindest was ist die erwartete Struktur.

public async Task<IActionResult> RegisterSubmit(Registermodel rm) 
{ 
     if (rm.role == "" || rm.role.Trim() == "-1") 
     { 
      return View(); 
     } 
     else 
     { 
      var user = new ApplicationUser { UserName = rm.username, Email = rm.username, DeptName = rm.role }; 
      var result = await _userManager.CreateAsync(user, rm.Password); 
      if (result.Succeeded) 
      { 
       _userManager.GenerateEmailConfirmationTokenAsync(user); 
       await _signInManager.SignInAsync(user, isPersistent: false); 
       var roleexists = await _roleManager.RoleExistsAsync(rm.role); 
       if (!roleexists) 
       { 
        var role = new IdentityRole(); 
        role.Name = rm.role; 
        await _roleManager.CreateAsync(role); 

       } 
       await _userManager.AddToRoleAsync(user, rm.role); 
       user.Claims.Add(new IdentityUserClaim<string> 
       { 
        ClaimType = "ProductUploadRequest", 
        ClaimValue = "Allow" 
       }); 

      } 
      return View("Login"); 


     } 

    } 

Dies ist meine Login-Methode.

public async Task<IActionResult> Login(LoginIdentityModel lim) 
{ 

     var result = await _signInManager.PasswordSignInAsync(lim.username, lim.password,false, lockoutOnFailure: false); //exception comes here 
     if (result.Succeeded) 
     { 
      var user = await _userManager.GetUserAsync(HttpContext.User); 

      UserProfileInfo userProfileInfo = new UserProfileInfo(); 
      userProfileInfo.UserId = new Guid(user.Id); 
      userProfileInfo.FirstName = "test"; 
      userProfileInfo.UserName = lim.username; 
      userProfileInfo.LastVisit = DateTime.Now; 
      string query2 = "select ud.UserId,dp.Id DeptId,dp.Name DeptName,rd.Id RoleId,rd.Name RoleName,ud.[ReadWrite] from UserInDepartment ud inner join Department dp on ud.DeptId=dp.Id inner join RolesInDepartment rd on dp.Id=rd.DeptId and ud.RoleId=rd.Id where ud.UserId='" + user.Id + "' and dp.IsEnable=1 and rd.IsEnable=1 and ud.IsEnable=1"; 
      var userProfile = await _departMentalContext.UserProfiles.FromSql(query2).SingleOrDefaultAsync(); 
      if (userProfile != null) 
      { 

       Dictionary<int, string> deptValues = new Dictionary<int, string>() { { userProfile.DeptId, userProfile.DeptName } }; 
       userProfileInfo.Dept = deptValues; 
       Dictionary<int, string> roleValues = new Dictionary<int, string>() { { userProfile.RoleId, userProfile.RoleName } }; 
       userProfileInfo.Role = roleValues; 

       userProfileInfo.ReadOrWrite = userProfile.ReadWrite; 

       HttpContext.Session.SetObject(UserProfileSessionName, userProfileInfo); 
      } 
      return View("/Home/DashBoard"); 

     } 
     return View(); 

} 
+0

Warum verwenden Sie kein ORM wie EF, Drapper oder andere? Zumindest schreibe deine SQL-Anfrage nicht in den Controller, es ist keine gute Übung ... – Coemgen

+0

wir verwenden EF. –

+0

Also, um Ihre Datenbank zu erstellen/zu aktualisieren, verwenden Sie CLI-Befehl zu init: https://docs.microsoft.com/en-us/ef/core/miscellaneous/cli/dotnet Wenn Sie VS verwenden, können Sie ausführen diejenigen in der Paket-Manager-Konsole: - Add-Migration "'init" - Update-Datenbank – Coemgen

Antwort

0

Da Sie EF verwenden, sollten Sie in der Lage sein, Ihre Modelldatenbank zu aktualisieren.

Sie können den CLI-Befehl (docs.microsoft.com/en-us/ef/core/miscellaneous/cli/dotnet) verwenden.

Oder wenn Sie Visual Studio verwenden, in der Paket-Manager-Konsole können Sie diese Befehle ausführen:

  • Add-Migration "init"

  • Update-Database

Befehle können Sie tu Update Tabelle in Ihrer Datenbank. Außerdem erstellt es Migrationsdateien, die ein "Bild" Ihrer Modelle darstellen. Wenn der Befehl Update-Database ausgeführt wird, lädt er die letzte Migrationsdatei.

Verwandte Themen