Crystal Reports SP26-SP33 ASP.NET集成身份验证模拟失效问题咨询
Crystal Reports Runtime SP26+ 身份模拟失效问题分析与修复
问题概述
将Crystal Reports Runtime从21版升级到SP33后,ASP.NET项目中设置IntegratedSecurity = True时,报表始终使用IIS应用池账户连接SQL Server,无法切换到当前模拟的用户身份。经测试,SP26至SP33全版本均存在此问题,SP25及更早版本功能正常。
使用的连接配置代码:
Dim cnnInfo As CrystalDecisions.Shared.ConnectionInfo = New ConnectionInfo() With cnnInfo .ServerName = "(local)" .DatabaseName = "MYDB" .IntegratedSecurity = True End With Call SetDBLogonForReport(cnnInfo, fCR) Call SetDBLogonForSubReport(cnnInfo, fCR)
问题根源
SAP在Crystal Reports SP26及后续版本中调整了Windows身份验证的底层逻辑:默认不再自动继承ASP.NET的身份模拟上下文,强制使用应用池进程账户建立数据库连接。这是SAP为加强安全管控做出的机制变更,直接导致原有模拟身份传递逻辑失效。
修复方案
方案1:显式传递模拟用户身份令牌
在配置连接信息时,手动将当前模拟用户的Windows身份令牌注入到Crystal Reports连接上下文,步骤如下:
- 确保项目web.config已启用身份模拟:
<identity impersonate="true"/> - 修改连接代码,添加身份令牌设置:
Imports System.Security.Principal ' 获取当前模拟用户的Windows身份实例 Dim currentWinIdentity As WindowsIdentity = WindowsIdentity.GetCurrent() Dim cnnInfo As CrystalDecisions.Shared.ConnectionInfo = New ConnectionInfo() With cnnInfo .ServerName = "(local)" .DatabaseName = "MYDB" .IntegratedSecurity = True ' 显式传入模拟用户的身份令牌 .ImpersonationToken = currentWinIdentity.Token End With Call SetDBLogonForReport(cnnInfo, fCR) Call SetDBLogonForSubReport(cnnInfo, fCR)
方案2:回退到SP25版本
若暂时无法修改代码,可直接回退到Crystal Reports Runtime SP25版本,该版本保留了原有身份模拟处理逻辑,能正常使用模拟用户身份连接数据库。
方案3:安装SAP官方修复补丁
检查SAP支持门户是否针对此问题发布了专属补丁,部分SP26+版本可能有修复身份模拟失效的更新包,安装后可恢复原有功能。
验证方法
- 部署修改后的代码或回退版本
- 查询SQL Server的
sys.dm_exec_sessions视图,确认连接的login_name为当前模拟用户而非应用池账户 - 执行报表关联的存储过程,通过
SUSER_SNAME()验证执行身份是否符合预期
内容的提问来源于stack exchange,提问作者user3931360
相关产品推荐
相关产品推荐

