ASP.NET Core使用精简版Identity Framework存储UserID的方案咨询
问题解答
问题1:能否像Session一样用Identity存储这类用户变量?
完全可以,你当前使用的Cookie认证自带的Claims机制就是做这个的,完全不需要引入Identity全套的表结构和冗余功能。
你在生成登录用的claims列表时,直接把UserID作为自定义Claim存入即可,示例代码如下:
// 你原来生成其他Claim的逻辑保留,新增下面这行 claims.Add(new Claim(ClaimTypes.NameIdentifier, "当前登录用户的实际UserID")); var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme); // 后面你原来的登录逻辑保持不变即可
需要取用时,在控制器任意位置都可以直接读取,不需要任何额外存储依赖:
var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);
你的控制器代码修改后就可以直接使用该值:
[HttpPost] [ValidateAntiForgeryToken] public ActionResult AddFirm([FromBody] FirmModel model) { // 直接从当前登录用户的Claims中取UserID var userId = User.FindFirstValue(ClaimTypes.NameIdentifier); String query = "exec dbo.A2Q_Edit_0112_RR_UploadNewReview_AddFirm @FIRM_NAME, @USER_ID"; System.Diagnostics.Debug.WriteLine("value:" + model.FIRM_NAME); using (var connection = new SqlConnection(connectionString)) { var json = connection.QuerySingle<string>(query, new { FIRM_NAME = model.FIRM_NAME , USER_ID = userId}); return Content(json, "application/json"); } }
问题2:是否有安全的方式利用现有Cookie存储或直接作为UserID使用?
上面提到的Claim存储方式本身就是符合要求的安全方案:
- 所有存入Claims的内容都会被ASP.NET Core自动加密、签名后存入认证Cookie,前端无法篡改,篡改后的Cookie会直接被服务端校验不通过
- 默认配置的认证Cookie是HttpOnly属性的,Vue前端的JS代码完全读取不到Cookie内容,不会出现UserID暴露给前端的问题
- 不需要你自己做任何加密处理,框架原生就做好了全链路安全校验
问题3:ASP.NET Core 3.1 + IIS 8环境下,用Session是否是最优选择?
绝对不是,Session有多个明显的缺陷:
- 默认采用内存存储,IIS应用池回收、重启都会导致Session全部丢失,如果后续做多实例部署,Session默认不跨实例共享,需要额外配置分布式Session,增加运维和开发复杂度
- 你后续要接入SignalR,而SignalR官方明确说明不支持Session,用Session的话后续还要重构核心逻辑
- 相比Claims的无状态特性,Session需要服务端维持存储,性能和可靠性都不如直接用认证Cookie自带的Claims机制
如果后续需要存储的用户自定义字段较多,不建议全部塞进Claims避免Cookie过大影响请求性能,此时可以考虑用分布式缓存(比如Redis)以用户ID为Key存储额外字段,性能和可靠性都远高于Session。
内容的提问来源于stack exchange,提问作者Qiuzman
相关产品推荐
相关产品推荐

