加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – 来自AJAX的表单身份验证和POST请求

发布时间:2020-12-16 03:50:56 所属栏目:asp.Net 来源:网络整理
导读:我们有一个受表单身份验证保护的ASP.NET应用程序该应用程序大量使用MS AJAX来调用其Web服务. 当表单身份验证超时,并且发生GET请求时 – 一切都很好(用户被重定向到登录页面). 但是当表单身份验证超时并发生POST请求时(ajax) – 没有重定向发生,而应用程序返
我们有一个受表单身份验证保护的ASP.NET应用程序该应用程序大量使用MS AJAX来调用其Web服务.

当表单身份验证超时,并且发生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);
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读