您现在的位置是:主页>文章>ASP.NET Forms身份认证 网站首页

ASP.NET Forms身份认证

在开发ASP.NET项目中,我们最常用的是Forms认证,也叫【表单认证】,以前做些小型项目的时候用的是自己编码采用Cookie+Session实现身份验证,但实际上在安全性和工作效率上,反而没有直接使用.net已经实现的身份验证方式来的好,而且安全快捷。这里就为大家小小的介绍下.net的身份认证。

在这个方面本人小小推荐下:细说ASP.NET Forms身份认证  这篇文章写的很不错,大概就介绍了.net的身份认证是怎么一回事。

要使用.net的身份验证就要实现IPrincipal接口,下面我贴一下,项目中的一个自定义实现IPrincipal接口的MyFormsPrincipal

 [Serializable]
    public class MyFormsPrincipal : IPrincipal    where TUserData : class, new()
    {

        private IIdentity _identity;
        private TUserData _userData;
       
        public MyFormsPrincipal(FormsAuthenticationTicket ticket, TUserData userData)
        {
            if (ticket == null)
                throw new ArgumentNullException("ticket");
            if (userData == null)
                throw new ArgumentNullException("userData");

            _identity = new FormsIdentity(ticket);
            _userData = userData;
        }

        public TUserData UserData
        {
            get { return _userData; }
        }

        public IIdentity Identity
        {
            get { return _identity; }
        }   

        public bool IsInRole(string role)
        {
            // 把判断用户组的操作留给UserData去实现。
            IPrincipal principal = _userData as IPrincipal;
            if (principal == null) throw new NotImplementedException();
            else
                return principal.IsInRole(role);
        }

        public static void TrySetUserInfo(HttpContext context)
        {
            if (context == null)
                throw new ArgumentNullException("context");

            // 1. 读登录Cookie
            HttpCookie cookie = context.Request.Cookies[FormsAuthentication.FormsCookieName];
            if (cookie == null || string.IsNullOrEmpty(cookie.Value))
                return;

            try
            {
                TUserData userData = null;
                // 2. 解密Cookie值,获取FormsAuthenticationTicket对象
                FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value);

                if (ticket != null && string.IsNullOrEmpty(ticket.UserData) == false)
                    // 3. 还原用户数据
                    userData = (new JavaScriptSerializer()).Deserialize(ticket.UserData);
                if (ticket != null && userData != null)
                // 4. 构造我们的MyFormsPrincipal实例,重新给context.User赋值。
                {
                    context.User =  System.Threading.Thread.CurrentPrincipal = new MyFormsPrincipal(ticket, userData); 
                    //context.Response.Write(context.User.ToString());
                }

            }
            catch (Exception ex)
            { /* 有异常也不要抛出,防止攻击者试探。 */
               // throw ex;
            }
        }

        /// 
        /// 执行用户登录操作
        /// 
        /// 登录名
        /// 与登录名相关的用户信息
        /// 登录Cookie的过期时间,单位:分钟。
        public static void SignIn(string loginName, TUserData userData, int expiration)
        {
            if (string.IsNullOrEmpty(loginName))
                throw new ArgumentNullException("loginName");
            if (userData == null)
                throw new ArgumentNullException("userData");

            // 1. 把需要保存的用户数据转成一个字符串。
            string data = null;
            if (userData != null)
                data = (new JavaScriptSerializer()).Serialize(userData);


            // 2. 创建一个FormsAuthenticationTicket,它包含登录名以及额外的用户数据。
            FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
                2, loginName, DateTime.Now,   DateTime.Now.AddMinutes(expiration), true, data); 

            // 3. 加密Ticket,变成一个加密的字符串。
            string cookieValue = FormsAuthentication.Encrypt(ticket); 
            // 4. 根据加密结果创建登录Cookie
            HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, cookieValue);
            cookie.HttpOnly = true;
            cookie.Secure = FormsAuthentication.RequireSSL;
            cookie.Domain = FormsAuthentication.CookieDomain;
            cookie.Path = FormsAuthentication.FormsCookiePath;
            if (expiration > 0)
            {
                cookie.Expires = DateTime.Now.AddMinutes(expiration);
            }
            HttpContext context = HttpContext.Current;
            if (context == null)
                throw new InvalidOperationException(); 
            // 5. 写登录Cookie
            context.Response.Cookies.Remove(cookie.Name);
            context.Response.Cookies.Add(cookie);
        }
    }

以上JavaScriptSerializer类需要添加引用System.Web.Extensions。

待续...

Top