首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在ASP.NET MVC中自动更改用户角色

如何在ASP.NET MVC中自动更改用户角色
EN

Stack Overflow用户
提问于 2021-09-13 14:02:15
回答 2查看 48关注 0票数 0

我想要改变用户角色,一旦他们自动完成一些工作,但正常的db.savechanges()不工作,他们甚至没有抛出任何错误,一些能解决这个问题吗?

控制器中用于更改数据库中用户角色的代码为:

代码语言:javascript
复制
[AllowAnonymous]
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Login(PRSV_Login loginData, string ReturnUrl = "")
        {
            string message = "";
            using (PRSVEntities db = new PRSVEntities())
            {
                var dataItem = db.PRSV_Login.Where(x => x.Email == loginData.Email).FirstOrDefault();
                if (dataItem != null)
                {
                    if(string.Compare(Encrypto.Hash(loginData.Password), dataItem.Password) == 0)
                    {
                        int timeout = 20;
                        var ticket = new FormsAuthenticationTicket(loginData.Email, true, timeout);// pass one more variable admin
                        string encrypted = FormsAuthentication.Encrypt(ticket);
                        var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encrypted);
                        cookie.Expires = DateTime.Now.AddMinutes(timeout);
                        cookie.HttpOnly = true;
                        Response.Cookies.Add(cookie);

                        if (Url.IsLocalUrl(ReturnUrl))
                        {
                            return Redirect(ReturnUrl);
                        }
                        else
                        {
                            if (dataItem.Role == "Admin")
                            {
                                return RedirectToAction("AdminPanel", "Home");
                            }
                            if (dataItem.Role == "Voter")
                            {
                                var isEmail = IsEmailExist(loginData.Email);
                                if (isEmail)
                                {
                                    loginData.Role = "Voted";
                                    db.SaveChanges();
                                    Session["username"] = dataItem.Name;
                                    Session["Email"] = dataItem.Email;
                                    ModelState.AddModelError("EmailExist", "Candidate has Already Voted!");
                                    Session["message"] = "<h1 class=\"display-5 fw-bold sorry\">sorry!</h1><br><p class=\"col-md-8 fs-4\"><b>" +
                                    dataItem.Name + ",</b> <br><br>You can not vote <b>twice or more!</b><br></p>";
                                    return RedirectToAction("Sorry", "Home");
                                }
                                else
                                {
                                    Session["username"] = dataItem.Name;
                                    Session["Email"] = dataItem.Email;
                                    TempData["Name"] = dataItem.Name;
                                    TempData["Email"] = dataItem.Email;
                                    return RedirectToAction("VotePanel", "Home");
                                }   
                            }
                            else
                            {
                                if (dataItem.Role == "Voted")
                                {
                                    Session["username"] = dataItem.Name;
                                    Session["Email"] = dataItem.Email;
                                    ModelState.AddModelError("EmailExist", "Candidate has Already Voted!");
                                    Session["message"] = "<h1 class=\"display-5 fw-bold sorry\">sorry!</h1><br><p class=\"col-md-8 fs-4\"><b>" +
                                    dataItem.Name + ",</b> <br><br>You can not vote <b>twice or more!</b><br></p>";
                                    return RedirectToAction("Sorry", "Home");
                                    
                                }

                                else
                                {
                                    message = "Invalid credential provided";
                                    return RedirectToAction("Index", "Home");
                                }
                            }
                        }
                    }
                    else
                    {
                        ModelState.AddModelError("", "Invalid Email-Id/Password");
                        return View();
                    }
                }
                else
                {
                    ModelState.AddModelError("", "Invalid Email-Id/Password");
                    return View();
                }
            }
        }

我也在使用身份包。我还为这个角色操作使用了一个单独的类,如下所示

代码语言:javascript
复制
namespace DEE_PRSV_V2_3.MyRoleProvider
{

    public class SiteRole : RoleProvider
    {
        public override void AddUsersToRoles(string[] usernames, string[] roleNames)
        {
            throw new NotImplementedException();
        }

        public override string ApplicationName
        {
            get
            {
                throw new NotImplementedException();
            }
            set
            {
                throw new NotImplementedException();
            }
        }

        public override void CreateRole(string roleName)
        {
            throw new NotImplementedException();
        }

        public override bool DeleteRole(string roleName, bool throwOnPopulatedRole)
        {
            throw new NotImplementedException();
        }

        public override string[] FindUsersInRole(string roleName, string usernameToMatch)
        {
            throw new NotImplementedException();
        }

        public override string[] GetAllRoles()
        {
            throw new NotImplementedException();
        }

        public override string[] GetRolesForUser(string Email)
        {
            PRSVEntities db = new PRSVEntities();
            string data = db.PRSV_Login.Where(x => x.Email == Email).FirstOrDefault().Role;
            string[] result = { data };
            return result;
        }

        public override string[] GetUsersInRole(string roleName)
        {
            throw new NotImplementedException();
        }

        public override bool IsUserInRole(string username, string roleName)
        {
            throw new NotImplementedException();
        }

        public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames)
        {
            throw new NotImplementedException();
        }

        public override bool RoleExists(string roleName)
        {
            throw new NotImplementedException();
        }
    }
}
EN

回答 2

Stack Overflow用户

发布于 2021-09-13 14:07:23

您正在更改方法参数loginData的值,该值未附加到您的上下文。您应该更改从数据库检索到的dataItemRole

票数 1
EN

Stack Overflow用户

发布于 2021-09-13 14:28:46

如果您使用的是ASP.NET Identity,则可以将UserManager注入到控制器中。

代码语言:javascript
复制
private readonly UserManager<ApplicationUser> _userManager;

public MyController(UserManager<ApplicationUser> userManager)
{
    _userManager = userManager;
}

//Action Method

public async Task<IActionResult> Login(...)
{
    // Get current user. You can also use UserManager's 
    // FindByIdAsync or FindByEmailAsync methods.
    var user = await _userManager.GetUserAsync(HttpContext.User);

    // Add user to role
    var result = await _userManager.AddToRoleAsync(user, "MyRole");

    if(result.Succeeded)
    {
        //Handle result
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69164037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档