.NET Core写入Session和Cookie

mac2024-04-04  32

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

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

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

public async Task<IActionResult> 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<AdminInfo>("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下有效。 });

 

最新回复(0)