Asp.Net EF SQLite环境下患者创建预约被错误归属到其他用户问题
问题根源
你在GET请求的CreateAppointment方法中对患者角色做了ID强制覆盖,确保视图渲染时隐藏字段PatientId是当前登录患者的正确ID,但POST请求的处理逻辑中完全没有对患者角色提交的PatientId做校验和重写:
- 一旦前端隐藏字段被篡改、页面缓存导致ID残留、多账号切换时本地缓存未清空,前端提交的
ab.PatientId就会是错误值 - 后台直接将错误的
PatientId写入数据库,就会出现预约归属到其他患者名下的问题 - 管理员、经理创建预约时是主动选择正确的患者ID,所以不会触发该问题,和你排查的现象完全吻合
解决方案
1. 修复POST接口的权限校验逻辑
在POST方法的最开头新增患者角色的ID强制覆盖逻辑,完全忽略前端传递的PatientId值,从根源避免参数篡改风险:
[HttpPost] [Authorize(Roles="Manager,Doctor,Patient")] [ValidateAntiForgeryToken] public IActionResult CreateAppointment(AppointmentViewModel ab) { // 新增逻辑:患者角色只能用自己的ID创建预约 if (User.IsInRole("Patient")) { ab.PatientId = GetSignedInUserId(); } // 原有逻辑保持不变 if (!svc.IsAppointmentSlotForDoctorAvailable(ab.DoctorId, ab.StartDateTimeBooking)) { ModelState.AddModelError("ApptDate", "Appointment Slot is not available"); } // ... 剩余原有代码不变 }
2. 额外可选校验
如果你的业务允许医生为患者创建预约,可新增医生角色的参数校验,确保提交的PatientId真实存在:
if (User.IsInRole("Doctor")) { var patient = svc.GetPatientById(ab.PatientId); if (patient == null) { ModelState.AddModelError("PatientId", "所选患者不存在"); } }
3. 辅助排查项
确认GetSignedInUserId()方法的返回值类型和Patient表的主键Id类型完全匹配,避免出现字符串转整数时的精度丢失、格式转换错误导致的ID异常。同时检查AppointmentViewModel中StartDateTimeBooking的绑定逻辑,确保视图中分开提交的ApptDate和ApptTime能正确合并为完整的时间值。
内容的提问来源于stack exchange,提问作者Student
相关产品推荐
相关产品推荐

