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下有效。 });