You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 20:48:02