接獲報案,使用Telerik RadAsyncUpload上傳元件的WebForm網頁有時成功有時失敗,上傳失敗的檔案多試幾次有時會成功,用多台機器測試失敗率有高有低,難以捉摸。使用F12開發者工具檢視,錯誤發生在瀏覽器以POST傳送包含檔案內容的multipart/form-data資料到/MyWeb/Telerik.Web.UI.WebResource.axd?type=rau,但伺服器端傳回{ "message" : "RadAsyncUpload handler is registered succesfully, however, it may not be accessed directly." }。

由於檔案上傳時好時壞,初步排除RadAsyncUpload Handler安裝或註冊問題。反覆實驗多次,由蒐集到的成功及失敗案例,歸納出一個關鍵現象:當Request Header出現Authorization: Negotiate TlRMTVNTUAADAAAAGAAYAH…就會失敗;Request Header未包含Authorization則會成功。

依經驗,瀏覽器之所以回傳Authorization Header,在於回應伺服器端的驗證要求,由於F12開發者工具的網路擷取功能不包含供認證細節。到了HTTP茶包重兵器表現的時刻-Fiddler登場!

用Fiddler側錄上傳成功與失敗的網路傳輸,馬上看出關鍵差異。

上圖的編號46跟47是一次失敗上傳,第一次伺服器HTTP 401要求瀏覽器提供登入認證,第二次的Request增加Authorization Header,伺服器回傳HTTP 200,但在這個情況下,RadAsyncUpload Handler未正確接收上傳檔案,吐回錯誤。(透過反組譯追進RadAsyncUpload Handler,當 Request.Files.Length == 0 就會傳回 …it may not be accessed directly 訊息)

編號50則是一次成功上傳,Request不包含Authorization Header,伺服器爽快傳回HTTP 200,完成上傳動作。

有了這個線索,鎖定IIS認證方向偵辦:網站採用Windows驗證,依觀察結果研判Telerik.Web.UI.WebResource.axd在Windows驗證模式運作不正常。(但我無法解釋同樣是不含Authorization Header的Request,為何有時收到401,有時會收到200?)

在網路上查到一些開放WebResource.axd匿名存取的做法(參考),情境不完全相同但原理類似,官方建議在web.config加入以下設定:

<location path="Telerik.Web.UI.WebResource.axd">
    <system.web>
        <authorization>
            <allow users="*" />
        </authorization>
    </system.web>
</location>

設定匿名存取後問題排除。留下一個謎團:同樣未傳Authorization Header,為何有時WebResource.axd要求登入認證,有時又能直接傳回結果?先歸入X檔案,日後再破解。


Comments

Be the first to post a comment

Post a comment