1.在登陆方法中存储session、cookie值
public JsonResult Login(AdminUser adminUser,bool check) { Operate operate = new Operate(); AdminUser adminUsers = new AdminUser(); Expression<Func<AdminUser, bool>> lambdaExpression = a => a.Name == adminUser.Name && a.Password == adminUser.Password; adminUsers = adminInfoService.Query(lambdaExpression); operate.Success = adminUsers != null; if (adminUsers != null) { operate.Success = true; //存储session值 AdminContext.adminContext.adminInfo = adminUsers; //如果选中保存密码则存储cookie if (check) { //存储cookie //创建一个Cookie对象 HttpCookie httpCookie = new HttpCookie("CookieName"); //设置Cookie的值 httpCookie.Values.Add("Name", adminUsers.Name); httpCookie.Values.Add("Password", adminUsers.Password); httpCookie.Values.Add("DateTime", DateTime.Now.AddDays(7).ToString("yyyy-MM-dd HH:mm:ss")); //设置Cookie的过期时间 httpCookie.Expires = DateTime.Now.AddDays(7); System.Web.HttpContext.Current.Response.Cookies.Add(httpCookie); } } return Json(operate); }2.session存储的是对象,而提供的是没有对象的,所以自写方法
在公共层中添加SessionExtensions.cs
3.SessionExtensions.sc
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); } }4.去Startup.cs配置服务注入与中间件
服务注入
//注册session services.AddSession(s=> { s.Cookie.Name = ".Market.Session"; s.Cookie.HttpOnly = true;//防止Xss攻击 s.IdleTimeout = TimeSpan.FromSeconds(30);//过期时间 }); //注册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 = "/Account/Login"; //在身份验证的时候判断为“未登录”则跳转到这个页面 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.登陆页面的控制器判断是否存在cookie值
public IActionResult Login() { //判断是否存在cookie值 //用户的身份是否已经授权 if (User.Identity.IsAuthenticated) { return RedirectToAction("Index", "Home"); } return View(); }6.Index页面的方法
public IActionResult Index() { UserInfo userInfo = HttpContext.Session.Get<UserInfo>("UserInfo"); //判断是否是cookie授权进来,需要手动设置session if (userInfo == null) { //得到用户名 var userName = User.Identity.Name; //根据用户名获取对象 userInfo = userInfoService.UserInfoName(userName).data; //设置session HttpContext.Session.Set("UserInfo",userInfo); } return View(userInfo); }7.过滤器(在UI层中添加一个Attribute文件夹)添加一个UserAuthorizeAttribute.cs
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{{ "Account", "Login" }, {"Home", "Index"}}; //跳转到指定路由 filterContext.Result = new RedirectToRouteResult(route); return; } }8.在Startup.cs中的Services.AddMvc()中修改
修改前:
修改后:
9.在HomeController控制器上添加【UserAuthorize】设置权限
10.清除cookie值
public async Task<IActionResult> LoginOutAsync() { await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme); return RedirectToAction("Login", "Account"); }