2016-01-16 57 views
1

我在管理员区域(部分)中拥有控制器名称UserController。我可以在其中将角色管理员(A)分配给用户(U)或将用户(U)分配给管理员(A)。身份验证和授权角色问题

this is the image of List of All users which i can assign them Roles

当我改变它在数据库中成功更新也是任何用户的角色,但是当我从那个用户,其中我已经改变了角色的应用程序登录,从而使用户包含它的老role.I已经把破还指出变量'角色'正在返回以前的角色。我很惊讶,'角色'变量如何恢复其旧角色。

public override string[] GetRolesForUser(string username) 
     { 
     string[] role = { obj.GetAll().Where(x => x.EmailAddress == username).FirstOrDefault().Role }; 
     return role; 
    } 

用户控制器AssignRole行动在这段代码我更新的角色

public ActionResult AssignRole(int id, string role) 
    { 
     try 
     { 
     BOL.tbl_Login user = (BOL.tbl_Login)obj.login.GetById(id); 
     if (role == "A") 
     { 
      user.Role = "U"; 
     } 
     else if (role == "U") 
     { 
      user.Role = "A"; 
     } 
     else 
     { 
      user.Role = "U"; 
     } 
     obj.login.Update(user); 
     TempData["Msg"] = "Operation Successfully!"; 

     } 
     catch (Exception ex) 
     { 
      TempData["Msg"] = "Error " + ex.Message; 
     } 
     return RedirectToAction("_Index"); 
    } 

和我还使用

[Authorize(Roles = "A")] 

我认为实体框架不返回最新的数据。

这里是数据访问层的代码

public override void Update(T data) 
    { 
     obj.Entry(data).State = EntityState.Modified; 
     obj.Configuration.ValidateOnSaveEnabled = false; 
     Save(); 

     obj.Configuration.ValidateOnSaveEnabled = true; 
    } 

回答

2

你的问题是,作用是节省了以前和当前值。 AsNoTracking功能不保存以前的值,它只显示当前值。把我的代码放在你获得角色的地方,或者你的方法'getroles'之上,这样你的问题就可以解决了

public override IEnumerable<T> GetAll() 
    { 

     return obj.Set<T>().AsNoTracking().ToList(); 
    } 
+0

谢谢哥们,AsNoTracking解决我的问题.. –