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]