.Net Core的session和cookie

1.在公共层里创建一个sessionExtensions

public static class SessionExtensions
    {
        /// 
        /// 添加session对象
        /// 
        /// 
        /// 
        /// 
        /// 
        public static void Set(this ISession session, string key, T value)
        {
            session.SetString(key, JsonConvert.SerializeObject(value));
        }
        /// 
        /// 获取session对象
        /// 
        /// 
        /// 
        /// 
        /// 
        public static T Get(this ISession session, string key)
        {
            var value = session.GetString(key);
            return value == null ? default(T) : JsonConvert.DeserializeObject(value);
        }
    }

2.在登陆成功之后添加cookie

public async Task ValidateLoginAsync(string userName,string userPwd)
        {
            var result = adminInfoService.ValidateLogin(userName, userPwd);
            if (result.success)
            {
                AdminInfo adminInfo = result.data;
                HttpContext.Session.Set("Market_User", adminInfo);
                //设置cookie
                var identity = new ClaimsIdentity("Forms");     // 指定身份认证类型
                identity.AddClaim(new Claim(ClaimTypes.Sid, adminInfo.AdminId.ToString()));  // 用户Id
                identity.AddClaim(new Claim(ClaimTypes.Name, userName));       // 用户名称
                //创建身份证这个证件的携带者:我们叫这个证件携带者为“证件当事人”
                var principal = new ClaimsPrincipal(identity);
                await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal, new AuthenticationProperties { IsPersistent = true });

            }
            return Json(result);
        }

3.在Home控制器把对象导入

  public IActionResult Index()
        {
            //如果通过cookie授权进来的需要手动设置session

            AdminInfo adminInfo = HttpContext.Session.Get("Market_User");
            if (adminInfo == null)
            {
                var userName = User.Identity.Name;
                //根据用户名获取对象
                adminInfo = adminInfoService.GetAdminInfo(userName).data;
                //重新设置session
                HttpContext.Session.Set("Market_User", adminInfo);
            }
            return View(adminInfo);
        }

4.在Startup里面激活和添加中间件

//数据服务注入
            services.AddDataService();
            //注册 session
            services.AddSession(s =>
                {
                    s.Cookie.Name = ".Market.Session";
                    s.Cookie.HttpOnly = true;//防止xss攻击
                    s.IdleTimeout = TimeSpan.FromMinutes(30);
                });
            services.AddMvc(config =>
            {
                config.Filters.Add(typeof(UserAuthorizeAttribute));
            });
            //添加cookie认证
            services.AddAuthentication(o =>
            {
                o.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;//使用默认的Scheme认证授权Scheme

            }).AddCookie(o =>
            {
                //关于Cookie的配置信息请参考:https://www.cnblogs.com/sheldon-lou/p/9545726.html
                //o.Cookie.Domain = ".contoso.com";//设置Cookie的作用域:他的作用域就包括contoso.com,www.contoso.com
                o.LoginPath = "/Home/Index"; //在身份验证的时候判断为“未登录”则跳转到这个页面
                o.LogoutPath = "/Account/LoginOut";//如果要退出登录则跳转到这个页面
                //o.AccessDeniedPath = "/Account/AccessDenied"; //如果已经通过身份验证,但是没有权限访问则跳转到这个页面
                o.Cookie.HttpOnly = true;//设置 cookie 是否是只能被服务器访问,默认 true,为true时通过js脚本将无法读取到cookie信息,这样能有效的防止XSS攻击,窃取cookie内容,这样就增加了cookie的安全性
                o.SlidingExpiration = true;//设置Cookie过期时间为相对时间;也就是说在Cookie设定过期的这个时间内用户没有访问服务器,那么cookie就会过期,若有访问服务器,那么cookie期限将从新设为这个时间
                o.ExpireTimeSpan = TimeSpan.FromDays(1); //设置Cookie过期时间为1天
                o.ClaimsIssuer = "Cookie";//获取或设置应用于创建的任何声明的颁发者
                //o.Cookie.Path = "/app1"; //用来隔离同一个服务器下面的不同站点。比如站点是运行在/app1下面,设置这个属性为/app1,那么这个 cookie 就只在 app1下有效。
            });
//注册session中间件
            app.UseSession();
            //注册cookie授权
            app.UseAuthentication();

5.在web层里面放一个过滤器

 public class UserAuthorizeAttribute : AuthorizeAttribute, IFilterMetadata
    {

        public virtual void OnAuthorization(AuthorizationFilterContext filterContext)
        {
            //获取对应Scheme方案的登录用户呢?使用HttpContext.AuthenticateAsync
            var authenticate = filterContext.HttpContext.AuthenticateAsync(CookieAuthenticationDefaults.AuthenticationScheme);
            if (authenticate.Result.Succeeded)
            {
                return;
            }
            //
            string path = filterContext.HttpContext.Request.Path;
            //创建一个路由
            var route = new RouteValueDictionary{{ "Controller", "Login" },
                            {"Action", "Index"}};
            //跳转到指定路由
            filterContext.Result = new RedirectToRouteResult(route);
            return;
        }
    }

6.在Home控制器里面添加[UserAuthorizeAttribute]

你可能感兴趣的:(.Net Core的session和cookie)