好的,回答我自己的問題。
尋找到這個問題,並研究多一點後,我發現,當一個web應用程序是通過表單的身份驗證保護和用戶未通過身份驗證,這是發生了什麼:
- 如果它是GET請求 - 用戶被重定向到登錄頁面 。
- 如果這是對頁面的POST請求 - 用戶是 重定向到登錄頁面。
- 如果它是一個POST請求到Web服務 - 在 用戶得到401不正當
那如何ASP。NET工程
如果一個Web服務被AJAX(xmlHttpRequest對象)調用並返回401 - 當然瀏覽器顯示一個彈出登錄框。
現在,你應該做的是添加一些代碼到Application_PostAuthenticateRequest,這將防止投擲401的Web服務。
protected void Application_PostAuthenticateRequest(Object sender, EventArgs e)
{
if (Request.RequestType == "POST" //if its POST
&& !User.Identity.IsAuthenticated //if user NOT authed
&& !HasAnonymousAccess(Context) //if it's not the login page
)
{
//lets get the auth type
Configuration config = WebConfigurationManager.OpenWebConfiguration("~");
SystemWebSectionGroup grp = (SystemWebSectionGroup)config.GetSectionGroup("system.web");
AuthenticationSection auth = grp.Authentication;
//if it FORMS auth
if(auth.Mode== AuthenticationMode.Forms)
{
//then redirect... this redirect won't work for AJAX cause xmlHttpRequest can't handle redirects, but anyway...
Response.Redirect(FormsAuthentication.LoginUrl, true);
Response.End();
}
}
}
public static bool HasAnonymousAccess(HttpContext context)
{
return UrlAuthorizationModule.CheckUrlAccessForPrincipal(
context.Request.Path,
new GenericPrincipal(new GenericIdentity(string.Empty), null),
context.Request.HttpMethod);
}
你用FireBug看了看實際發送到服務器的是什麼以及它迴應了什麼?瀏覽器的內置提示通常表示您嘗試訪問的資源受基本或NTLM身份驗證的保護。你的網站部分是否啓用了這種認證? – 2009-12-10 07:29:24
是的,在IIS設置中我們有「windows集成」身份驗證(以及「匿名訪問」)。謝謝,我會嘗試螢火蟲 – Alex 2009-12-10 08:00:46