zoukankan      html  css  js  c++  java
  • 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,收工。

  • 相关阅读:
    JMXRemote Source Downloads? Circular? 规格严格
    Java Heap Dump3 规格严格
    Java Heap Dump2 规格严格
    Java 时区总结 规格严格
    Java HeapDump 规格严格
    JDK 动态代理 规格严格
    常用日语100句
    Wine 1.0发布日期已定!
    细节的感动
    Blog正式改名
  • 原文地址:https://www.cnblogs.com/EddyPeng/p/2643671.html
Copyright © 2011-2022 走看看