当表单身份验证超时,并且发生GET请求时 – 一切都很好(用户被重定向到登录页面).
但是当表单身份验证超时并发生POST请求时(ajax) – 没有重定向发生,而应用程序返回“401 unathorized”,浏览器提示输入用户名和密码(不是登录表单,而是浏览器内置对话框) ).当然输入任何用户名/密码永远不会有帮助.
我该如何处理?
更新:用firebug查看之后,我发现常规POST请求重定向到登录正常,只有网络服务调用才会抛出“401 Unauthorizes”.
常规请求和Web服务之间的区别是URL.对于常规的后请求,这是“page.aspx”,对于webservices,是“service.asmx / MethodName”…
解决方法
在研究了这个问题并进行了一些研究之后,我发现当一个web-app受到Forms-Authentication的保护并且用户未经过身份验证时,会发生以下情况:
>如果是GET请求 – 用户是
重定向到登录页面.
>如果是对页面的POST请求 – 用户是
重定向到登录页面.
>如果是对Web服务的POST请求 –
用户获得401未授权
这就是ASP.NET的工作原理
如果一个Web服务由AJAX(xmlHttpRequest对象)调用并返回401 – 当然浏览器会显示一个弹出式登录框.
现在,您应该做的是向Application_PostAuthenticateRequest添加一些代码,以防止为webservices抛出401.
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); }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。