Pet*_*son 5 cookies asp.net-mvc
这是情况......
站点1)ASP.NET MVC应用程序,供客户登录,查看和支付账单等.该站点使用无cookie的ASP会话,允许多个会话在选项卡式浏览器中运行.
站点2)具有标准静态内容的公司网站.这将在每个页面的顶部有一个小表单,其中包含将发布到MVC应用程序的用户名/密码表单.
发布到MVC应用程序时,正在生成一个新会话,并且该站点返回302重定向,其中URL中包含会话ID(如预期的那样).控制器有两个Login方法,一个用于处理GET,一个用于处理POST.由于重定向,它击中了GET方法并且它丢失了表单值.
通过更改公司站点上的方法来执行表单GET而不是POST,用户名和密码在重定向后保留在查询字符串中,我可以通过这种方式处理请求,但我宁愿做一个POST而不是通过URL中的数据.
我的直觉说实现某种自定义HttpHandler会允许我这样做,但我不确定我能在哪里与会话创建联系起来.global.asax中Session_Start的断点显示会话ID已经被装箱,并且该点已经发生重定向.
我相信我找到了重定向发生的位置以及可能的解决方案。ISessionIDManager 接口有一个 SaveSessionID 方法,其上有一个“out bool 重定向”参数。看起来,当创建新会话时,默认会话管理器会重写此方法内的 URL 并执行重定向。我尝试实现自己的 ISessionIDManager,并且能够抑制重定向,但是(据我所知)无法在不进行重定向的情况下将会话 ID 插入到无 cookie 会话的 URL 中。在请求生命周期的此时,不允许使用 Server.Transfer。我尝试过,但收到“执行子请求时出错”消息。
后来,我发现了这篇关于在无cookie的ASP.NET应用程序中启用POST的文章。基本上,通过绑定到 Application_EndRequest 事件,您可以检测重定向、清除响应并伪造表单发布到包含会话 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());
}
}
Run Code Online (Sandbox Code Playgroud)
恕我直言,这不是一个理想的解决方案,但它可能足以满足要求。
| 归档时间: |
|
| 查看次数: |
2125 次 |
| 最近记录: |