Forms认证实战

      最近在升级一款软件产品,原来是交给一个外包公司做的,质量的方面不做评论。唯一觉得不是很好的是认证方式

      没错,用的是基本身份验证,也就是说每次登录要弹出一个巨丑无比的窗口,然后填上Windows的账号登录。如果作为一个内部应用,丑点也就算了,但毕竟这是一款未来将要商用的软件,难道要给每个客户开通一个服务器端的Windows账号吗?这恐怕不太可行。并且涉及到账号权限、过期时间等一系列可扩展的行为将无法或很难实现。所以我就改成了这样

      各位看官一看就明白了,我把认证方式改成了Forms认证。这样我们就可以结合Forms认证来进行账号管理、权限等等一系列扩展行为。下面说一下实现吧

一、首先是配置文件,

      在Web.config的System.Web节点中增加如下配置

<authentication mode="Forms">
      <forms name=".ASPXAUTH" loginUrl="login.aspx" defaultUrl="/" protection="All" timeout="700" path="/" requireSSL="false" slidingExpiration="true" cookieless="UseDeviceProfile" domain="eddy.peng.com" enableCrossAppRedirects="false">
        <credentials passwordFormat="SHA1" />
      </forms>
    </authentication>

      具体的属性含义我就不把MSDN的搬过来了,大家可以自行前往查看。需要注意的一点是,如果使用vs右键浏览然后附加进程的方式去debug程序,会发现不能包含“domain”属性的,否则你的调试将无法继续进行下去。

<machineKey validationKey="3FF1E929BC0534950B0920A7B59FA698BD02DFE8" decryptionKey="280450BB36319B474C996B506A95AEDF9B51211B1D2B7A77" decryption="3DES" validation="SHA1" />


      machineKey 这个配置是用来配合Forms认证进行cookie加密和解密使用的,如果不配置这个节点,那你的cookie就会明文存在客户端了。

 

二、配置文件配置好之后,就是写登录代码,然后再判断状态取出用户身份了,流程很清晰,现在把代码贴出来供大家参考

     1、写cookie

        /// <summary>
        /// 用户登录
        /// </summary>
        /// <param name="userAccount">用户账号</param>
        /// <param name="password">密码</param>
        /// <returns>登录成功返回True</returns>
        public static bool Login(string userAccount, string password)
        {
            bool result = false;

            password = Common.Encrypt(password);

            using (***DataContext ndc = new ***DataContext())
            {
                var r = (from u in ndc.Users where u.UserName == userAccount && u.Password == password select u).ToList();

                if (r.Count > 0)
                {
                    result = true;

                    SetCookies(r[0].UserID, userAccount, r[0].RealName, Convert.ToInt32(r[0].IsAdmin));
                }
            }

            return result;
        }       

        /// <summary>
        /// 设置用户Cookies
        /// </summary>
        /// <param name="userId">用户ID</param>
        /// <param name="userAccount">用户账号</param>
        /// <param name="realName">名称</param>
        /// <param name="isAdmin">是否是管理员</param>
        private static void SetCookies(int userId, string userAccount, string realName, int isAdmin )
        {
            string AuthCookieContent = string.Format("{0},{1},{2},{3}", userId, userAccount, realName, isAdmin);

            HttpContext.Current.Response.AddHeader("P3P", "CP=CAO PSA OUR");

            FormsAuthentication.SetAuthCookie(AuthCookieContent, false);
        }

     2、在页面中判断状态,读取用户身份

                if (HttpContext.Current.Request.IsAuthenticated)
                {
                    LoginUser user = new LoginUser();

                    string[] authCookies = HttpContext.Current.User.Identity.Name.Split(',');

                    user.Id = int.Parse(authCookies[0]);
                    user.Account = authCookies[1];
                    user.Name = authCookies[2];
                    user.Role = authCookies[3] == "0" ? UserRole.Common : UserRole.Admin;

                }
                else
                {
                    HttpContext hc = HttpContext.Current;

                    hc.Response.Redirect("/login.aspx?returnurl=" + hc.Request.Url.AbsolutePath);
                }

到此,告一段落。

这篇文章只是从实战的角度给大家一个示例,至于更深层次的知识和原理还需要大家通过其他途径获得。

OK,收工。

posted on 2012-08-21 11:13  小黑混北京  阅读(500)  评论(0编辑  收藏  举报