gpt4 book ai didi

asp.net-mvc - 无 Cookie session 和跨站点表单帖子

转载 作者:行者123 更新时间:2023-12-02 04:03:49 24 4
gpt4 key购买 nike

情况是这样的...

站点 1) ASP.NET MVC 应用程序,供客户登录、查看和支付账单等。该站点使用无 cookie 的 ASP session 来允许多个 session 在选项卡式浏览器中运行。

站点 2) 具有标准静态内容的公司网站。每个页面顶部都会有一个小表单,其中包含将发布到 MVC 应用程序的用户名/密码表单。

发布到 MVC 应用程序时,会生成一个新 session ,并且站点将返回 302 重定向,其中 URL 中包含 session ID(如预期)。 Controller 有两种登录方法,一种用于处理 GET,一种用于处理 POST。由于重定向,它会调用 GET 方法并丢失表单值。

通过更改公司网站上的方法以执行表单 GET 而不是 POST,用户名和密码将在重定向后保留在查询字符串中,我可以通过这种方式处理请求,但我宁愿执行 POST并且不在 URL 中传递该数据。

我的直觉告诉我,实现某种自定义 HttpHandler 可以让我做到这一点,但我不确定在哪里能够与 session 创建相关联。 global.asax 中 Session_Start 处的断点显示 session ID 已被创建,并且此时已发生重定向。

最佳答案

我相信我找到了重定向发生的位置以及可能的解决方案。 ISessionIDManager 接口(interface)有一个 SaveSessionID 方法,其上有一个“out bool 重定向”参数。看起来,当创建新 session 时,默认 session 管理器会重写此方法内的 URL 并执行重定向。我尝试实现自己的 ISessionIDManager,并且能够抑制重定向,但是(据我所知)无法在不进行重定向的情况下将 session ID 插入到无 cookie session 的 URL 中。在请求生命周期的此时,不允许使用 Server.Transfer。我尝试过,但收到一条“执行子请求时出错”消息。

后来我在Enabling POST in cookieless ASP.NET Applications上找到了这篇文章。基本上,通过绑定(bind)到 Application_EndRequest 事件,您可以检测重定向、清除响应并伪造表单发布到包含 session ID 的新 URL。

void MvcApplication_EndRequest(object sender, EventArgs e)
{

HttpApplication application = (HttpApplication)sender;

if (application.Request.Form["CorpLogin"] == "1"
&& application.Response.RedirectLocation != null
&& application.Response.IsRequestBeingRedirected)
{

StringBuilder build = new StringBuilder();
build.Append("<html>\n<body>\n<form name='Redirect' method='post' action='");
build.Append(application.Response.RedirectLocation);

build.Append("' id='Redirect' >");
foreach (string key in application.Request.Form)
{
if (key != "CorpLogin")
build.Append(string.Format("\n<input type='hidden' name='{0}' value = '{1}'>", (string)key, application.Request.Form[(string)key]));
}

build.Append("\n<noscript><h2>Object moved <input type='submit' value='here'></h2></noscript>");
build.Append(@"</form>
<script language='javascript'>
<!--
document.Redirect.submit();
// -->
</script>
");
build.Append("</body></html>");

application.Response.Clear();
application.Response.ClearHeaders();
application.Response.Output.Flush();

application.Response.Write(build.ToString());

}
}

恕我直言,这不是一个理想的解决方案,但它可能足以满足要求。

关于asp.net-mvc - 无 Cookie session 和跨站点表单帖子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2001308/

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