【发布时间】:2020-02-14 20:27:50
【问题描述】:
我有一个非常标准的 ASP.NET Core 2.2 Web 应用程序。 我在下载存储在网络共享上的文件时遇到问题。我们在代码中使用模拟方法(客户要求)来访问文件共享。使用提供的凭据上传到共享工作正常,因此我们知道 (a) 模拟工作正常,并且 (b) 文件位于目标位置。我遇到的问题来自下载文件。这是一个非常标准的下载链接,它指向控制器中的一个操作,该操作从数据库中获取文件信息并使用两个数据库值(PathToFile 和 Filename)来获取文件的位置并将其拉回控制器,然后通过返回一个文件:
var fileRecord = //Get the record from the database.
byte[] bytes = null;
if(fileRecord != null)
{
try
{
string fullPath = $"{fileRecord.PathToFile}\\{fileRecord.Filename}";
await ImpersonationHelper.Impersonate(async () => { bytes = await System.IO.File.ReadAllBytesAsync(fullPath); }, _settings);
}
catch (Exception e)
{
return NotFound();
}
}
return File(bytes, System.Net.Mime.MediaTypeNames.Application.Octet, fileRecord.Filename);
供参考:
public static async Task Impersonate(Action actionToExecute, ApplicationSettings settings)
{
IntPtr tokenHandle = new IntPtr(0);
SafeAccessTokenHandle safeAccessTokenHandle = null;
ImpersonateLogin login = new ImpersonateLogin(settings);
Task<bool> returnValue = Task.Run(() => LogonUser(login.username, login.domain, login.password, 2, 0, out safeAccessTokenHandle));
if (false == returnValue.Result)
{
int ret = Marshal.GetLastWin32Error();
throw new System.ComponentModel.Win32Exception(ret);
}
if(safeAccessTokenHandle != null)
await returnValue.ContinueWith(antecedent => WindowsIdentity.RunImpersonated(safeAccessTokenHandle, () =>
{
actionToExecute();
}));
}
}
在本地,它运行良好(我们跳过了应用设置的模拟),文件返回并设置为浏览器中的下载。
但是,在服务器上,它不起作用,但它也起作用。奇怪:点击链接会出现错误页面:
但是一遍又一遍地刷新这个错误页面(即重新请求该文件)会使其正常工作(通常每 2-4 次刷新将正确返回文件)。
有没有人遇到过这种情况,或者类似的事情可以提供一些见解?
【问题讨论】:
标签: c# asp.net-core