这几天在用MVC做一个项目,用到了HttpContext.User.IsInRole() 这个方法,但是每次当我用的时候,HttpContext.User.IsInRole(“Admin”) 返回的永远是false。 在网上查了很多资料,发现都没有解决,要解决的话,也要实现一系列的扩展方法。好,废话少说,正式进入主题:
  
  
   if (HttpContext.User.Identity == null || String.IsNullOrEmpty(HttpContext.User.Identity.Name))
   
   {
   
   return Redirect("~/Account/LogOn?returnUrl=/service");
   
   }
   
   else if (HttpContext.User.IsInRole("Admin"))
   
   {
   
   return RedirectToAction("Index", "AdminService");
   
   }
   
   else
   
   {
   
   …….
   
   }
  
  
   if (HttpContext.User.Identity == null || String.IsNullOrEmpty(HttpContext.User.Identity.Name))
   
   {
   
   return Redirect("~/Account/LogOn?returnUrl=/service");
   
   }
   
   else if (HttpContext.User.IsInRole("Admin"))
   
   {
   
   return RedirectToAction("Index", "AdminService");
   
   }
   
   else
   
   {
   
   …….
   
   }
  
  
   
    在
    
     Global.asax
     
      中添加以下方法:
     
    
   
  
  
   /// <summary>
   
   /// Authen right for user
   
   /// </summary>
   
   /// <param name="sender"></param>
   
   /// <param name="e"></param>
  
  
   ////
   
    给登陆用户赋权限
   
   
   protected void Application_AuthenticateRequest(Object sender, EventArgs e)
   
   {
   
   if (HttpContext.Current.User != null)
   
   {
   
   if (HttpContext.Current.User.Identity.IsAuthenticated)
   
   {
   
   if (HttpContext.Current.User.Identity is FormsIdentity)
   
   {
   
   //Get current user identitied by forms
   
   FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity;
   
   // get FormsAuthenticationTicket object
   
   FormsAuthenticationTicket ticket = id.Ticket;
   
   string userData = ticket.UserData;
   
   string[] roles = userData.Split(',');
   
   // set the new identity for current user.
   
   HttpContext.Current.User = new GenericPrincipal(id, roles);
   
   }
   
   }
   
   }
   
   }
  
  
   /// <summary>
   
   /// Authen right for user
   
   /// </summary>
   
   /// <param name="sender"></param>
   
   /// <param name="e"></param>
   
   protected void Application_AuthenticateRequest(Object sender, EventArgs e)
   
   {
   
   if (HttpContext.Current.User != null)
   
   {
   
   if (HttpContext.Current.User.Identity.IsAuthenticated)
   
   {
   
   if (HttpContext.Current.User.Identity is FormsIdentity)
   
   {
   
   //Get current user identitied by forms
   
   FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity;
   
   // get FormsAuthenticationTicket object
   
   FormsAuthenticationTicket ticket = id.Ticket;
   
   string userData = ticket.UserData;
   
   string[] roles = userData.Split(',');
   
   // set the new identity for current user.
   
   HttpContext.Current.User = new GenericPrincipal(id, roles);
   
   }
   
   }
   
   }
   
   }
  
  
   LogOn
  
  
   [HttpPost]
   
   public ActionResult LogOn(LogOnModel model, string returnUrl)
   
   {
   
   if (ModelState.IsValid)
   
   {
   
   if(ValidateUser(model.UserName, model.Password)))
   
   {
  
  
   //
   
    给登陆成功用户赋于指定权限
   
   
   UserInfo userInfo = GetuserInfo(model.UserName);
   
   if (userInfo.Role =="Admin")                    {
   
   role = "Admin";
   
   }
   
   FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1,
   
   userInfo.Alias,
   
   DateTime.Now,
   
   DateTime.Now.AddMinutes(30),
   
   false,
   
   role);
   
   string encTicket = FormsAuthentication.Encrypt(authTicket);
   
   this.Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName,encTicket));
  
  
   //  FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
   
   if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
   
   && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
   
   {
   
   return Redirect(returnUrl);
   
   }
   
   else
   
   {
   
   return RedirectToAction("Index", "Home");
   
   }
   
   }
   
   else
   
   {
   
   ModelState.AddModelError("", "The user name or password provided is incorrect.");
   
   }
   
   }
  
  
   // If we got this far, something failed, redisplay form
   
   return View(model);
   
   }
  
  
   [HttpPost]
   
   public ActionResult LogOn(LogOnModel model, string returnUrl)
   
   {
   
   if (ModelState.IsValid)
   
   {
   
   if(ValidateUser(model.UserName, model.Password)))
   
   {
   
   UserInfo userInfo = GetuserInfo(model.UserName);
   
   if (userInfo.Role =="Admin")                    {
   
   role = "Admin";
   
   }
   
   FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1,
   
   userInfo.Alias,
   
   DateTime.Now,
   
   DateTime.Now.AddMinutes(30),
   
   false,
   
   role);
   
   string encTicket = FormsAuthentication.Encrypt(authTicket);
   
   this.Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName,encTicket));
   
   
   //  FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
   
   if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
   
   && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
   
   {
   
   return Redirect(returnUrl);
   
   }
   
   else
   
   {
   
   return RedirectToAction("Index", "Home");
   
   }
   
   }
   
   else
   
   {
   
   ModelState.AddModelError("", "The user name or password provided is incorrect.");
   
   }
   
   }
   
   
   // If we got this far, something failed, redisplay form
   
   return View(model);
   
   }