zoukankan      html  css  js  c++  java
  • MVC 基于 AuthorizeAttribute 实现的登陆权限控制

    代码的执行顺序是 OnAuthorization–>AuthorizeCore–>HandleUnauthorizedRequest. 如果AuthorizeCore返回false时,才会走HandleUnauthorizedRequest 方法,并且Request.StausCode会返回401。

     首先创建一个MCV的项目,在App_Start目录下创建一个类UserAuthAttribute,此类要继承AuthorizeAttribute类,这里继承的时候注意using System.Web.Mvc; 

    接着在App_Start目录下找到 FilterConfig类,添加注册。

    登陆页面:

    <!DOCTYPE html>
    
    <html>
    <head>
        <meta name="viewport" content="width=device-width" />
        <title>LogIn</title>
    </head>
    <body>
        <div style=" 600px; margin:50px auto;">
            <form action="/Account/LogIn" method="post">
                <table>
                    <tr><td>User Name</td><td><input type="text" id="username" name="username" /></td></tr>
                    <tr><td>Pass word</td><td><input type="password" id="password" name="password" /></td></tr>
                    <tr><td></td><td><input type="submit" value="LogIn" /></td></tr>
                </table>
            </form>
        </div>
    </body>
    </html>

    登陆后台

    [AllowAnonymous]
            public ActionResult LogIn()
            {
                string User_Name = this.Request.Form["username"];
                string User_Pw = this.Request.Form["password"];
                if (!string.IsNullOrEmpty(User_Name) && !string.IsNullOrEmpty(User_Pw))
                {
                    List<User> Ulist = TestData.Users;
                    var userinfos = Ulist.Where(e => e.UserName.Equals(User_Name) && e.PassWord.Equals(User_Pw));
                    if (userinfos != null && userinfos.Count() == 1)
                    {
                        User _user = userinfos.FirstOrDefault();
                        Session[WebConstants.UserSession] = _user;
                        Session[WebConstants.UserRoleMenu] = TestData.GetMenuByUserID(_user.UserID);
                        string fromurl = Request.UrlReferrer.Query;
                        if (fromurl.IndexOf("?fromurl=") > -1)
                        {
                            fromurl = fromurl.Substring(9);
    
                            return this.Redirect(fromurl);
                        }
                        else
                        {
                            return this.RedirectToAction("Home", "Account");
                        }
    
                    }
                }
    
                return View();
            }

    注意:LogIn()加了标识 [AllowAnonymous] ,表示允许任何用户访问.

    登陆完成后,session记录用户信息和可访问的Menu信息,跳转到主页或者先前页。

    最重要的一个环节就是之前创建的UserAuthAttribute这个类:

    在类里先定义个变量

     public bool IsLogin = false;

    验证是否已经登陆,判定是否有权限

    protected override bool AuthorizeCore(HttpContextBase httpContext)
            {
                bool Pass = false;
                try
                {
                    var websession = httpContext.Session[WebConstants.UserSession];
                    if (websession == null)
                    {
                        httpContext.Response.StatusCode = 401;//无权限状态码
                        Pass = false;
                        IsLogin = false;
                    }
                    else
                    {
                        User user = httpContext.Session[WebConstants.UserSession] as User;
                        if (user == null)
                        {
                            httpContext.Response.StatusCode = 401;//无权限状态码
                            Pass = false;
                            IsLogin = false;
                        }
                        else if (!IsMenuRole(httpContext))
                        {
                            httpContext.Response.StatusCode = 401;//无权限状态码
                            Pass = false;
                            IsLogin = true;
                        }
                        else
                        {
                            Pass = true;
                        }
                    }
                }
                catch (Exception)
                {
                    return Pass;
                }
                return Pass;
            }

    当上面这个方法返回false时才会执行下面这个方法, 进行跳转, 若没登陆,跳转到登陆页并带有参数,当登陆完成后可以跳转的先前页。这URL可以使用加密,防止客户修改或传递的参数发生编码错误。

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
            {
                if (filterContext == null)
                {
                    throw new ArgumentNullException("filterContext");
                }
                else
                {
                    if (!IsLogin)
                    {
                        string fromUrl = filterContext.HttpContext.Request.Url.PathAndQuery;
                        // string strUrl = new UrlHelper(filterContext.RequestContext).Action("Login", "Account","") + "?fromurl={0}";
                        string strUrl = "~/Account/Login/?fromurl={0}";
                        //filterContext.HttpContext.Response.Redirect(string.Format(strUrl, fromUrl), true);
    filterContext.Result = new RedirectResult(string.Format(strUrl, fromUrl)); }
    else { filterContext.Result = new RedirectResult("~/Account/NoPremission"); } } }
  • 相关阅读:
    IP地址分类和局域网常用IP地址
    【转载】NAT(Network Address Translation )——解决IPV4地址短缺之道的方法初识
    【转载】DNS域名解析中A、AAAA、CNAME、MX、NS、TXT、SRV、SOA、PTR各项记录的作用
    三层网络架构,接入交换机、汇聚交换机和核心交换机
    STP协议(生成树协议)简介
    最长回文子串 and 最长回文子序列(转)
    Leetcode030 substring-with-concatenation-of-all-words 字符串查找
    最长公共子序列 (LCS) 详解+例题模板(全)(转)
    MySQL常用命令
    数据库基础知识复习(转)
  • 原文地址:https://www.cnblogs.com/bin521/p/9292758.html
Copyright © 2011-2022 走看看