将输入类型="file" 与 ASP.Net 和 iPad 以及 IIS 的 Windows 集成身份验证结合使用

Using input type="file" with ASP.Net and iPad and IIS's Windows Integrated Authentication

我正在尝试使用 input type="file" 在无聊的旧 HTML 页面上上传一个非常基本的、简洁的文件上传到一个 .aspx 页面,两者都托管在 IIS 上(两者IIS7 和 IIS8)启用 Windows 集成身份验证(非匿名)。它在桌面 Chrome 上工作得很好,但如果我在 iPad 上使用 Chrome 或 Safari,我可以登录(通过 Windows Auth)并查看形式,但如果我选择一个文件并单击“发送”,它只会坐下来旋转。如果我选择一个文件,它工作正常。如果我从 Windows 身份验证切换到匿名身份验证,即使在 iPad 上也能正常工作。我选择的文件仅来自 iPad 的照片库(最初是用内置相机拍摄的),在测试 Chrome 桌面版时,我正在使用完全相同的文件进行测试(很小,1.4M)。

这是 default.html:

<!doctype html>
<html>
<head>
    <title>Upload Test</title>
</head>
<body>
    <form method="post" enctype="multipart/form-data" action="upload.aspx">
    <input type="file" name="foo" />
    <input type="submit" value="Send" />
    </form>
</body>
</html>

upload.aspx:

<%@ Page Language="C#" CodeBehind="upload.aspx.cs" Inherits="UploadTest.Upload" %>

upload.aspx.cs:

using System;
using System.Web.UI;

namespace UploadTest
{
    public partial class Upload : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            this.Response.ContentType = "text/plain";
            this.Response.Write("Got here");
            this.Response.End();
        }
    }
}

请注意,我什至没有尝试访问上面的 this.Request.Files,尽管如果我这样做,例如:

var file = this.Request.Files["foo"];
this.Response.Write("Filename: " + (file == null ? "(no file)" : file.FileName));

...我确实看到了文件名。

我没有 Web.config:我只是将 bindefault.htmlupload.aspx 复制到 [=27] 下的 test 目录中=] 然后使用 IIS 管理器将其转换为具有默认设置的应用程序,并从匿名身份验证切换到 Windows 身份验证。 (但这是一个更复杂的项目的 MCVE,它确实有一个 Web.config,我只是将事情剥离到骨头上以找到问题。)

回顾一下:

我不是什么大块头ASP.net。我究竟做错了什么?我需要翻转一些配置开关吗?

我改用 Kerberos 安全身份验证协议而不是 NTLM 协议,上传开始为我工作。

据我所知,这是 iOS (!) 中的错误,已在 iOS 11.0 中修复。不适用于 v10.3 的完全相同的配置适用于 v11。

不幸的是,iOS 11.0 will only be made available for 5th gen onward, so we've had to work around this by reading the file via the File API并将其作为非文件数据批量发送到服务器。 丑陋的 解决方法,但这是唯一有效的方法。