首页 > 解决方案 > 身份 ASP.NET 登录到错误的 UserId

问题描述

我已经在 ASP.NET Web Applications C# 上创建了一个应用程序,并且我已经实现了 ASP.NET Core Identity,因此我可以拥有登录功能。我的应用程序当前所做的是有 2 个用户表,1 个带有登录详细信息(AspNetUsers 表)和 1 个带有个人详细信息(我自己的用户表)。

发生的情况是,当我注册一个新帐户时,我会自动提示用户在该帐户中创建个人资料。然后,他们在输入表单后被重定向到他们的帐户页面。

当我注册时,我可以输入将存储在 AspNetUsers 表中的帐户详细信息(用户名、电子邮件、密码),然后,我重定向新用户以在他们的帐户中创建一个包含一些新字段(用户名、电子邮件、课程)的配置文件,课程负责人,加入日期)。完成后,他们将被定向到他们的帐户页面。

我的问题是,当我重新登录帐户时,它会打开与 AspNetUsers UserId 相关的 UserId,而不是打开他们输入新配置文件信息的配置文件 UserId。

这是他们创建帐户时输入的表格;

在此处输入图像描述

这是他们在创建个人资料之前输入的表格;

在此处输入图像描述

这是用户注册并创建个人资料后的页面 -电子邮件应该是 staff@com

在此处输入图像描述

这是重新登录帐户后的页面;

在此处输入图像描述

这是我的 Register 方法的 AccountController 代码;

        public async Task<ActionResult> Register(RegisterViewModel model)
    {
        if (ModelState.IsValid)
        {
            var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
            var result = await UserManager.CreateAsync(user, model.Password);
            if (result.Succeeded)
            {
                await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);
                UserManager.AddToRole(user.Id, "Student"); 
                Service.IService Service = new Service.Service();
                Data.User newUser = new Data.User
                {
                    UserId = user.Id,
                    Username = model.Name,
                    Email = model.Email
                }; 
                Service.AddUser(newUser);
                Session.Add("UserId", user.Id); 
                // For more information on how to enable account confirmation and password reset please visit https://go.microsoft.com/fwlink/?LinkID=320771
                // Send an email with this link
                // string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
                // var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
                // await UserManager.SendEmailAsync(user.Id, "Confirm your account", "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>");

                return RedirectToAction("AddUser", "Home");
            }
            AddErrors(result);
        }

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

这是我的 Login 方法的 AccountController 代码;

        public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
    {
        if (!ModelState.IsValid)
        {
            return View(model);
        }

        // This doesn't count login failures towards account lockout
        // To enable password failures to trigger account lockout, change to shouldLockout: true
        var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
        switch (result)
        {
            case SignInStatus.Success:
                Service.IService Service =
                    new Service.Service();
                Data.User loginUser = Service.GetUserEmail(model.Email);
                Session.Add("UserId", loginUser.UserId); 
                var um = new UserManager<ApplicationUser>(
                    new Microsoft.AspNet.Identity.EntityFramework.UserStore<ApplicationUser>(new ApplicationDbContext()));
                IList<string> roles = um.GetRoles(loginUser.UserId);
                Session.Add("Roles", roles);
                return RedirectToAction("GetUser", "Home", new { id = loginUser.UserId });
            case SignInStatus.LockedOut:
                return View("Lockout");
            case SignInStatus.RequiresVerification:
                return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
            case SignInStatus.Failure:
            default:
                ModelState.AddModelError("", "Invalid login attempt.");
                return View(model);
        }
    }

这是在登录过程中使用的函数 GetUserEmail 的代码;

        public User GetUserEmail(string email, MyContext context)
    {
        IQueryable<User> user = from u in context.Users where u.Email == email select u;
        return user.ToList().First();
    }

我不希望他们仅在创建配置文件时才在创建帐户时输入额外的详细信息,但我不知道如何实现这一点,而每个表都使用自己的 UserId,我假设我的方法 GetUserEmail 来获取用户详细信息从电子邮件中提取就足够了,因为这将返回具有匹配电子邮件的用户表中的用户 ID。我可以将 AspNetUsers 表的 UserId 传递到输入表单,然后在 GetUserEmail 方法中将电子邮件更改为 UserId 吗?请告诉我我能做什么。

标签: c#asp.net

解决方案


推荐阅读