.net 授权验证

授权部分

namespace xxxxxx
{
    /// <summary>
    /// 身份验证类
    /// </summary>
    /// <typeparam name="TUserData"></typeparam>
    public class ConsumerAuthentication<TUserData> where TUserData : class, new()
    {
        //Cookie保存是时间
        private const int CookieSaveDays = 14;

        /// <summary>
        /// 用户登录成功时设置Cookie
        /// </summary>
        /// <param name="username">用户名称</param>
        /// <param name="userData">用户实体</param>
        /// <param name="rememberMe">是否记住用户(true:记住)</param>
        public static void SetAuthCookie(string username, TUserData userData, bool rememberMe)
        {
            if (userData == null)
            {
                throw new ArgumentNullException("userData");
            }

            string  data = (new JavaScriptSerializer()).Serialize(userData);   //用户实体json串
            //为提供的用户名提供一个身份验证的票据
            FormsAuthentication.SetAuthCookie(username, true, FormsAuthentication.FormsCookiePath);

            FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(2, username, DateTime.Now, DateTime.Now.AddDays(CookieSaveDays), rememberMe, data);     //创建ticket
            string cookieValue = FormsAuthentication.Encrypt(ticket);    //加密ticket

            //创建Cookie
            var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, cookieValue)
            {
                HttpOnly = false,
                Secure = FormsAuthentication.RequireSSL,
                Domain = FormsAuthentication.CookieDomain,
                Path = FormsAuthentication.FormsCookiePath,
            };
            if (rememberMe)
            {
                cookie.Expires = DateTime.Now.AddDays(CookieSaveDays);
            }

            //写入Cookie
            HttpContext.Current.Response.Cookies.Remove(cookie.Name);
            HttpContext.Current.Response.Cookies.Add(cookie);
        }




        /// <summary>
        /// 从Request中解析出Ticket,UserData
        /// </summary>
        /// <param name="request">当前上下文中的HttpRequest</param>
        /// <returns></returns>
        public static ConsumerFormsPrincipal<TUserData> TryParsePrincipal(HttpRequest request)
        {
            if (request == null)
            {
                throw new ArgumentNullException("request");
            }

            //1.  读登录Cookie
            HttpCookie cookie = request.Cookies[FormsAuthentication.FormsCookieName];    //获取cookie中的登陆信息
            if (cookie == null || string.IsNullOrEmpty(cookie.Value)) return null;

            try
            {
                // 2. 解密Cookie值,获取FormsAuthenticationTicket对象
                var ticket = FormsAuthentication.Decrypt(cookie.Value);
                if (ticket != null && !string.IsNullOrEmpty(ticket.UserData))
                {
                    var userData = (new JavaScriptSerializer()).Deserialize<TUserData>(ticket.UserData);
                    if (userData != null)
                    {
                        return new ConsumerFormsPrincipal<TUserData>(ticket, userData);
                    }
                }
                return null;
            }
            catch
            {
                /* 有异常也不要抛出,防止攻击者试探。 */
                return null;
            }
        }
    }
}

 

实体

UserRoles

namespace LightMarketingSystem.Web.InSevers
{    /// <summary>
    /// 用户角色对象
    /// </summary>
    public class UserRoles
    {
        /// <summary>
        /// 用户编号
        /// </summary>
        public int UserId { get; set; }
        /// <summary>
        /// 用户的角色编号
        /// </summary>
        public int RoleId { get; set; }

    }
}
View Code

 

    /// <summary>
    /// Manger用户对象
    /// </summary>
    public class ManagerUserDataPrincipal : IPrincipal
    {


        /// <summary>
        /// 用户编号
        /// </summary>
        public int UserId { get; set; }
        /// <summary>
        /// 手机号
        /// </summary>
        public string Moblie { get; set; }
        /// <summary>
        /// 电子邮箱地址
        /// </summary>
        public string Mail { get; set; }
        /// <summary>
        /// 用户名称
        /// </summary>
        public string Name { get; set; }
        /// <summary>
        /// 用户所有角色
        /// </summary>
        public List<int> RoleId { get; set; }
        /// <summary>
        /// 用户组(名称)
        /// </summary>
        public string RoleGorup { get; set; }
        /// <summary>
        /// 是否必须修改密码
        /// </summary>
        public bool MandatoryPass { get; set; }

        //用户的角色源集合
        public List<UserRoles> mingshiDb = new List<UserRoles>();

        /// <summary>
        /// 当使用Authorize特性时,会调用该方法验证角色 
        /// </summary>
        /// <param name="role"></param>
        /// <returns></returns>
        public bool IsInRole(string role)
        {
            if (string.IsNullOrEmpty(role)) return true;

            //找出用户所有所属角色

            var roles = role.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);  //角色要求

            return (from s in roles from userrole in RoleId where s.Equals(userrole.ToString()) select s).Any();  //查找
        }



        /// <summary>
        /// 验证用户信息
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        public bool IsInUser(string user)
        {
            //找出用户所有所属角色组
            var users = user.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
            return users.Contains(RoleGorup);
 
        }


        [ScriptIgnore]    //在序列化的时候忽略该属性
        public IIdentity Identity { get { throw new NotImplementedException(); } }
    }
}
View Code

CustomerUserDataPrincipal

namespace xxxxx
{



    /// <summary>
    /// 用户对象的基本功能
    /// </summary>
    public class CustomerUserDataPrincipal : IPrincipal
    {


        /// <summary>
        /// 用户编号
        /// </summary>
        public int UserId { get; set; }
        /// <summary>
        /// 机构编号
        /// </summary>
        public int AgencyId { get; set; }
        /// <summary>
        /// 手机号
        /// </summary>
        public string Moblie { get; set; }
        public string Mail { get; set; }
        public string Name { get; set; }

        //这里可以定义其他一些属性
        public List<int> RoleId { get; set; }
        /// <summary>
        /// 用户组
        /// </summary>
        public string RoleGorup { get; set; }

        //用户的角色源集合
        public List<UserRoles> mingshiDb = new List<UserRoles>();

        /// <summary>
        /// 当使用Authorize特性时,会调用该方法验证角色 
        /// </summary>
        /// <param name="role"></param>
        /// <returns></returns>
        public bool IsInRole(string role)
        {
            if (string.IsNullOrEmpty(role)) return true;

            //找出用户所有所属角色

            var roles = role.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);  //角色要求

            return (from s in roles from userrole in RoleId where s.Equals(userrole.ToString()) select s).Any();  //查找
        }



        /// <summary>
        /// 验证用户信息
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        public bool IsInUser(string user)
        {
            //找出用户所有所属角色组
            var users = user.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
            return users.Contains(RoleGorup);

            // return mingshiDb.Any(u => users.Contains(u.RoleGp));
        }


        [ScriptIgnore]    //在序列化的时候忽略该属性
        public IIdentity Identity { get { throw new NotImplementedException(); } }
    }
}
View Code

ConsumerFormsPrincipal<TUserData>

namespace xxxxxx
{
    /// <summary>
    /// 通用的用户实体
    /// </summary>
    /// <typeparam name="TUserData"></typeparam>
    public class ConsumerFormsPrincipal<TUserData> : IPrincipal
        where TUserData : class, new()
    {
        /// <summary>
        /// 当前用户实例
        /// </summary>
        public IIdentity Identity { get; private set; }

        /// <summary>
        /// 用户数据
        /// </summary>
        public TUserData UserData { get; private set; }

        /// <summary>
        /// 使用用户票据和用户信息构建通用的用户实体
        /// </summary>
        /// <param name="ticket"></param>
        /// <param name="userData"></param>
        public ConsumerFormsPrincipal(FormsAuthenticationTicket ticket, TUserData userData)
        {

            if (ticket == null)
                throw new ArgumentNullException("ticket");
            if (userData == null)
                throw new ArgumentNullException("userData");

            Identity = new FormsIdentity(ticket);
            UserData = userData;

        }



        /// <summary>
        /// 角色验证
        /// </summary>
        /// <param name="role"></param>
        /// <returns></returns>
        public bool IsInRole(string role)
        {
            var userData = UserData as CustomerUserDataPrincipal;
            if (userData == null)
                throw new NotImplementedException();

            return userData.IsInRole(role);
        }



        /// <summary>
        /// 用户名验证
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        public bool IsInUser(string user)
        {
            var userData = UserData as CustomerUserDataPrincipal;
            if (userData == null)
                throw new NotImplementedException();

            return userData.IsInUser(user);
        }
    }
}
View Code

 

特性

namespace xxxxxx
{
    /// <summary>
    /// 验证角色和用户名的类
    /// </summary>
    public class ConsumerAuthorizeAttribute : AuthorizeAttribute
    {
        protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext)
        {
            var user = httpContext.User as ConsumerFormsPrincipal<CustomerUserDataPrincipal>;  //获取登陆的用户信息
            if (user != null)
            {
                return (user.IsInRole(Roles) || user.IsInUser(Users));   //验证角色信息
            }


            return false;
        }

        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {

            if (filterContext.HttpContext.Request.IsAjaxRequest()) //ajax调用方式 
            {
                filterContext.Result = new ContentResult();
                filterContext.HttpContext.Response.StatusCode = Convert.ToInt32(System.Net.HttpStatusCode.Forbidden);
            }
            else
            {
                //验证不通过,直接跳转到相应页面,注意:如果不使用以下跳转,则会继续执行Action方法

                string returnUrl = filterContext.HttpContext.Request.Url.AbsolutePath;  //获取当期请求的地址
                string redirectUrl = string.Format("?ReturnUrl={0}", returnUrl);
                string loginUrl = FormsAuthentication.LoginUrl + redirectUrl;
                //响应当前请求
                filterContext.HttpContext.Response.Redirect(loginUrl, true);
            }

        }
    }
}
View Code

 

使用

 登录部分

 1    if (user.IsPause == 0)
 2                     {
 3                         //构造用户数据(可以添加更多数据,这里只保存用户Id)
 4                         List<int> roleIdList = new List<int>();
 5                         roleIdList.Add(user.RoleId);
 6 
 7                         //用户:consumer
 8                         var userData = new CustomerUserDataPrincipal { UserId = user.Id, RoleId = roleIdList, AgencyId = user.AgencyId, Mail = user.EMail, Moblie = user.Moblie, Name = user.Name, RoleGorup = "consumer" };  //定义用户对象
 9                         //保存Cookie
10                         ConsumerAuthentication<CustomerUserDataPrincipal>.SetAuthCookie(user.Name, userData, rememberMe);
11                         //设置
12                         result.Result = user;
13                     }
14                     else
15                     {
16                         result.AddErrorCode("账号已被停用!");
17                     }
 1    /// <summary>
 2         /// 获取当前登录的客户信息
 3         /// </summary>
 4         /// <param name="context">当前请求的上下文对象</param>
 5         /// <returns></returns>
 6         public  static U_Staff GetCurrentContextUser(System.Web.HttpContextBase httpContext)
 7         {
 8             if (httpContext == null) return null;
 9             if (httpContext.User != null)
10             {
11 
12                 U_Staff staff = new U_Staff();
13                 //转换用户
14                 ConsumerFormsPrincipal<CustomerUserDataPrincipal> userData = (ConsumerFormsPrincipal<CustomerUserDataPrincipal>)httpContext.User;
15                 staff.Id = userData.UserData.UserId;
16                 staff.AgencyId = userData.UserData.AgencyId;
17                 staff.Moblie = userData.UserData.Moblie;
18                 staff.EMail = userData.UserData.Mail;
19                 staff.Name = userData.UserData.Name;
20                 staff.IsPause = userData.UserData.AgencyId;
21 
22                 return staff;
23             }
24             return null;
25         }

 

action 特性过滤器

 

    [ConsumerAuthorize(Users = "consumer")]  //要求登录,并且是这两种角色
    public class ConsumerController : Controller
    {
}

 

 

 

        /// <summary>
        /// 使安全模块对请求进行身份验证
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Application_PostAuthenticateRequest(object sender, System.EventArgs e)
        {
            var formsIdentity = HttpContext.Current.User.Identity as FormsIdentity;
            if (formsIdentity != null && formsIdentity.IsAuthenticated && formsIdentity.AuthenticationType == "Forms")
            {
                //获取当前登陆的用户
                HttpContext.Current.User = ConsumerAuthentication<CustomerUserDataPrincipal>.TryParsePrincipal(HttpContext.Current.Request);
            }
        }
     

 

posted @ 2019-06-03 11:19  Myisqq  阅读(275)  评论(0)    收藏  举报