SSRS无法显示本地SharePoint服务器图片的问题求助
背景
我正在开发一个解决方案,让ASP.NET WebForms页面中的RDLC文件能显示存储在独立于公司内网网站的SharePoint On-Premises服务器中的图片。在SharePoint加入域之前,旧版RDLC通过模拟虚拟用户(用户名和密码硬编码到使用advapi32库的静态C#变量中)访问SMB网络共享里的图片。
最初的尝试与问题
我最初考虑用SharePoint REST API获取数据,打算用带OAuth或Bearer Token的HttpWebRequest,后来想试试NTLM结合WebClient做认证。我误以为NTLM会使用客户端登录用户的凭证,于是写了以下代码:
using System; using System.Data; using System.Net; ... protected void ProcessedImageBytes(string uri, DataTable picturesTable) { byte[] imageBytes; using (var webClient = new WebClient()) { webClient.Credentials = CredentialCache.DefaultCredentials; // uri是SharePoint文件的链接 imageBytes = webClient.DownloadData(uri); } DataRow newRow = picturesTable.NewRow(); newRow["PictureBytes"] = Convert.ToBase64String(imageBytes); picturesTable.Rows.Add(newRow); }
之后程序会把DataRow内容提供给报表的ReportDataSource。
但我后来发现,CredentialCache.DefaultCredentials实际使用的是主机计算机的身份进行授权:我本地测试时正常,因为用的是我个人的配置文件(有权限访问SharePoint文件夹);但生产环境中网站主机服务器用的是NT AUTHORITY\NETWORK SERVICE身份,这是我通过在生产页面代码中调用WindowsIdentity.GetCurrent()发现的。
当前困境与临时方案
我希望通过NTLM来显示SharePoint链接里的图片,但目前看起来唯一的办法是再次把所需用户的用户名和密码硬编码到C#代码中——这是我不想做的。我查了很多方案,但大多针对SharePoint Online的Azure AD或Microsoft Graph,这些我都用不了。
编辑:
我想到了一个临时方案:让用户再次输入用户名和密码,把密码存在SecureString对象中传给WebClient来下载SharePoint数据。但这个方案很鸡肋,用户明明已经登录了还要再输凭证,只能算安全可行的临时办法,不是真正的解决方案。
内容的提问来源于stack exchange,提问作者Freerey

