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

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+版本可能有修复身份模拟失效的更新包,安装后可恢复原有功能。

验证方法

  1. 部署修改后的代码或回退版本
  2. 查询SQL Server的sys.dm_exec_sessions视图,确认连接的login_name为当前模拟用户而非应用池账户
  3. 执行报表关联的存储过程,通过SUSER_SNAME()验证执行身份是否符合预期

内容的提问来源于stack exchange,提问作者user3931360

相关产品推荐
方舟 Agent Plan

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

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