zoukankan      html  css  js  c++  java
  • asp.net 身份验证-Form 身份验证

    一、 .net身份验证简介

      1.身份验证就是检测用户是否登录及所访问的资源是否有权限。当我们在访问一个受保护网络资源时,往往需要输入用户名、密码信息,或通过其他证书、第三方身份验证等方式。验证(Authenticate)是认证的过程 ,授权(Authorization)是权限检查。

    获取权限,在.net中web.config 下提供了Window、Form、 Password、Basic、None身份验证,对于各种什么验证不做太多解释,可参考 http://www.cnblogs.com/sunnycoder/archive/2009/12/13/1623073.html。其中使用最广的是form身份验证,表单提交用户名和密码等信息进行验证。从.net 2.0有了基本的form身份验证后 ,from验证方式也不断在更新,从asp.net form(>=2.0)→membership→asp.net identity(>=4.5), 在到第三方Oauth2.0,微软的脚步是够快的...。今天主要介绍最基本的,2.0就有的老东西asp.net form身份验证,以后有时间会跟进 asp.net identity、Oauth2.0方面的文章。

     

    二、.net form身份验证票据写入

      1.记得以前记录身份验证会记住session中。后来觉得有两方面不太妥:1)如果项目大了,服务器压力无疑很大。2)服务器意外中断,重启后,登录身份丢失。

      2.简单实现form身份验证。我将采用mvc5项目进行演示。 新建mvc5项目,如果选择个人用户身份验证将会使用asp.net identity身份验证,同时会添加AccountController。里面包括用户注册、登录等实例代码。由于本文不涉及asp.net identity不做太多解释。修改web.config   <authentication mode="Forms"></authentication > 在Login Action中写入信息  FormsAuthentication.SetAuthCookie("testUser", true);

    此时最简单的from身份验证就ok啦,查看浏览器cookie信息,多了一个.aspxauth(可修改) 表示验证成功,默认cookie信息保存为30分钟。

      3.设置票据信息:上面一个示例只是简单的记录了一下用户已登录。如果要记录用户角色、设置cookie域、 过期时间等那就需要修改webconfig和写一个复杂的票据信息。

     // <summary>
            /// 执行用户登录操作
            /// </summary>
            /// <param name="loginName">登录名</param>
            /// <param name="expiration">登录Cookie的过期时间,单位:分钟。</param>
            /// <param name="isPersisten">是否跨浏览器保存用户会话</param>
            /// <param name="remeberMe">记住我</param>
            public static void LoginIn(LoginViewModel user, int expiration, bool isPersisten = false, bool remeberMe = false)
            {
                var response = HttpContext.Current.Response;
                var request = HttpContext.Current.Request;
    
                var roles = user.Roles;
                var rolesStr = roles == null ? string.Empty : String.Join(",", roles.Select(p => p.RoleENName));
                string userData = string.Format("{{Roles:'{0}',RemberMe:'{1}'}}", rolesStr, remeberMe.ToString());
    
                FormsAuthenticationTicket authTicket =new FormsAuthenticationTicket(
                  1
                  , user.UserName
                  , DateTime.Now
                  , remeberMe ? DateTime.Now.AddDays(7) : DateTime.Now.AddMinutes(expiration)
                  , isPersisten
                  , userData
              );
                string encryptedTicket = FormsAuthentication.Encrypt(authTicket); //加密
                HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
                response.Cookies.Add(authCookie);
    var returnUrl = request.QueryString["ReturnUrl"]; response.Redirect(string.IsNullOrEmpty(returnUrl) ? FormsAuthentication.DefaultUrl : returnUrl); }

    webconfig中除了 <authentication mode="Forms"></authentication >是必选项其余可选。我们可以再webconfig中设置cookie信息、资源限制等信息。

      <system.web>
        <authentication mode="Forms">
          <forms name="Test"
                protection="All"
                timeout="1"
                loginUrl="/Auth/Login"
                defaultUrl="~/"
                slidingExpiration="false"/>
        </authentication>
        <compilation debug="true" targetFramework="4.5" />
        <httpRuntime targetFramework="4.5" />
      </system.web>

     

    三、.net 身份验证票据信息读取

      1.判断时机:判断用户是否登录,如果没登录就调至登陆页,登录则读取相关信息。这个用户判断是在httphandler 还是httpmodule中呢。答案显然只需用户首次访问时判断就可以了,不必每次请求action都判断。所以是在httpmodule。对于每个控制器继承一个父类BaseController,再重写OnActionExecuting这种做法会影响性能,不是一个明智的选择。

      2.web.config截取:

      <!--页面权限控制-->
    <location path="Home/Index">
        <system.web>
            <authorization>
                <deny users="?"/>
            </authorization>
        </system.web>
    </location>
      <!--目录权限控制-->
     <location path="Member">
        <system.web>
            <authorization>
                <allow roles="Member"/>
                <deny users="*"/>
            </authorization>
        </system.web>
    </location>

      3.Aop拦截:在.net4.0中可以通过   [Authorize]特性判断用户是否登录,同时也可以自定义方法和特性控制。在global中通过下面方法控制

    protected void FormsAuthentication_OnAuthenticate(object sender, FormsAuthenticationEventArgs e)

      4.读取票据信息:

           var cookieName= FormsAuthentication.FormsCookieName;
               var cookie = Request.Cookies[cookieName];
    
               if (cookie!=null)
               {
                 //  FormsAuthentication.GetAuthCookie();
                 var ticket= FormsAuthentication.Decrypt(cookie.Value);//读取
                 var value=JsonConvert.DeserializeObject(ticket.UserData);
               }
    void Application_AuthenticateRequest(object sender, EventArgs e)
    {
        //在安全模块建立起当前用户的有效的身份时,该事件被触发。在这个时候,用户的凭据将会被验证。 
     
        string cookieName = FormsAuthentication.FormsCookieName;
        HttpCookie authCookie = Context.Request.Cookies[cookieName];
        FormsAuthenticationTicket authTicket = null;
        try
        {
            authTicket = FormsAuthentication.Decrypt(authCookie.Value);//解密
        }
        catch (Exception ex)
        {
            return;
        }
    
        string[] roles = authTicket.UserData.Split(new char[] { ',' });//如果存取多个角色,我们把它分解
    
        FormsIdentity id = new FormsIdentity(authTicket);
    
        System.Security.Principal.GenericPrincipal principal = new System.Security.Principal.GenericPrincipal(id, roles);
        Context.User = principal;//存到HttpContext.User中
    }
    

      

    四、参考

    http://www.cnblogs.com/fish-li/archive/2012/04/15/2450571.html

    http://www.cnblogs.com/sunnycoder/archive/2009/12/13/1623073.html

    http://www.360doc.com/content/12/0331/10/9525522_199530386.shtml

  • 相关阅读:
    读书笔记:HTML5的Doctype
    2017/09/06~2017/09/10:算法练习小记
    (分治)7617:输出前k大的数
    (递归)7215:简单的整数划分问题
    (递归)2106:Boolean Expressions
    (递归)8758:2的幂次方表示
    (递归)1750:全排列
    (枚举)8469:特殊密码锁
    关于使用unigui、webxone、mysql的几个问题
    DELPHI-Delphi常用类型及定义单元
  • 原文地址:https://www.cnblogs.com/chi8708/p/4696216.html
Copyright © 2011-2022 走看看