Angular与ASP.NET Core搭配的Session管理相关技术问题咨询
问题1解答
- 正常配置.NET Core Session中间件的前提下,调用
HttpContext.Session.SetString时,Session Id会自动通过Cookie写入浏览器,无需手动实现存储逻辑,默认Cookie名称为.AspNetCore.Session。 - 必须注意两个前置配置:
- Program.cs中中间件顺序不能错,要先注册
AddSession,然后在UseRouting之后、UseAuthorization之前调用UseSession - 前后端跨域的情况下,后端CORS配置要开启
AllowCredentials(),Angular端发起请求时需要在HttpClient的配置项中加withCredentials: true,否则浏览器会拒绝携带Session Cookie
- Program.cs中中间件顺序不能错,要先注册
- 验证请求是否携带Session Id的方法:
- 浏览器F12打开开发者工具,进入「应用/Application」面板,查看当前站点下的Cookie列表,确认存在
.AspNetCore.Session项 - 查看请求头的
Cookie字段,确认其中包含.AspNetCore.Session对应的取值即可
- 浏览器F12打开开发者工具,进入「应用/Application」面板,查看当前站点下的Cookie列表,确认存在
问题2解答
- 中间件只要注册在
UseSession之后,就可以直接通过HttpContext.Session.Id获取当前请求的Session Id - 管理员校验逻辑的实现步骤:
- 用户登录成功时,将用户身份信息写入Session,例如
HttpContext.Session.SetString("UserRole", "Admin")、HttpContext.Session.SetString("UserId", "xxx") - 编写自定义权限中间件,注册时放在
UseSession之后、UseAuthorization之前 - 中间件逻辑中先判断当前请求的路径是否属于管理员专属路径,如果是则从Session中读取
UserRole字段:- 读取不到或者取值不为
Admin的话,直接将响应状态码设为403并终止请求 - 校验通过则继续执行后续中间件逻辑
- 读取不到或者取值不为
- 用户登录成功时,将用户身份信息写入Session,例如
- 额外注意:默认Session是存储在服务端内存中的,仅适合单实例部署,如果是多实例部署需要将Session存储到分布式缓存(例如Redis),避免不同实例之间Session不同步的问题。
内容的提问来源于stack exchange,提问作者Prithvi Emmanuel Machado
相关产品推荐
相关产品推荐

