zoukankan      html  css  js  c++  java
  • MVC 用户权限HttpContext.User.IsInRole()

    这几天在用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
    {
      …….
    }
    复制代码

    上面的代码中HttpContext.User.IsInRole(“Admin”) 返回的是false。我们要返回True怎么办?

    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);
            }
    复制代码

     好了,直到这里,所有的问题,已经解决了。如果大家有其他的好的方法,可以分享, 欢迎留言指正 :)

  • 相关阅读:
    WEBSHELL跳板REDUH使用说明
    lcx.exe内网转发命令教程 + LCX免杀下载
    程序只启动一个实例的几种方法
    VS2010中遇到_WIN32_WINNT not defined
    VC编译错误: Nafxcwd.lib(dllmodul.obj) : error LNK2005: _DllMain@12已经在dllmain.obj 中定义
    python(31) enumerate 的用法
    利用余弦定理计算文本的相似度
    Linux命令(24) :sort
    python(30) 获取网页返回的状态码,状态码对应问题查询
    python(29)强大的zip函数
  • 原文地址:https://www.cnblogs.com/sjqq/p/7365938.html
Copyright © 2011-2022 走看看