登录时无效的对象名称“AspNetRoleClaims”异常

时间:2017-06-29 06:21:34

标签: asp.net asp.net-core asp.net-identity

所以我为我的核心项目实现了Identity。我已成功完成注册。因此,在尝试使用_signInManager.PasswordSignInAsync登录时,我收到异常无效的对象名称'AspNetRoleClaims'。

我知道这是因为我的数据库中没有AspNetRoleClaims表。但是idont知道这个表的结构,也不知道如何像在mvc中那样自动创建它。

有人可以告诉我为什么使用这个表。或者至少是预期的结构。

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");


        }

    }

这是我的登录方式。

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();

}

1 个答案:

答案 0 :(得分:0)

在使用EF时,您应该能够更新模型数据库。

您可以使用CLI命令(docs.microsoft.com/en-us/ef/core/miscellaneous/cli/dotnet)。

或者,如果您使用的是Visual Studio,则可以在程序包管理器控制台中执行这些命令:

  • Add-Migration "init"

  • Update-Database

命令允许您在数据库中更新表。此外,它还将创建迁移文件,这是一个&#34;图片&#34;你的模特执行命令Update-Database时,它会加载上一个迁移文件。