gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 17:00:59 25 4
gpt4 key购买 nike

我们有一个受表单例份验证保护的 ASP.NET 应用程序。该应用程序大量使用 MS AJAX 来调用其网络服务。

当表单例份验证超时并且发生 GET 请求时 - 一切都很好(用户被重定向到登录页面)。

BUT 当表单例份验证超时并且发生 POST 请求(ajax)时 - 不会发生重定向,而是应用程序返回“401 unathorized”并且浏览器会提示用户名和密码(不是登录表单,而是浏览器内置对话框)。当然,输入任何用户名/密码都没有帮助。

我该如何处理这个问题?

更新:查看 Firebug 后,我发现常规 POST 请求可以正常重定向到登录,只有 Web 服务调用会抛出“401 Unauthorizes”。常规请求和 Web 服务之间的区别在于 URL。其中“page.aspx”用于常规后期请求,“service.asmx/MethodName”用于 Web 服务...

最佳答案

好的,回答我自己的问题。

在研究这个问题并进行更多研究后,我发现当网络应用程序受表单例份验证保护并且用户未经过身份验证时,会发生以下情况:

  • 如果是 GET 请求 - 用户是重定向到登录页面。
  • 如果是对页面的 POST 请求 - 用户是重定向到登录页面。
  • 如果它是对网络服务的 POST 请求 -用户收到 401-未经授权

这就是 ASP.NET 的工作原理

如果 AJAX(xmlHttpRequest 对象)调用 Web 服务并返回 401 - 当然,浏览器会显示一个弹出登录框。

现在,您应该做的是向 Application_PostAuthenticateRequest 添加一些代码,以防止针对 Web 服务抛出 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);
}

关于asp.net - 来自 AJAX 的表单例份验证和 POST 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1879136/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com