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

asp.net-mvc – 无Cookie会话和跨站点表单帖子

发布时间:2020-12-16 03:18:44 所属栏目:asp.Net 来源:网络整理
导读:这是情况…… 站点1)ASP.NET MVC应用程序,供客户登录,查看和支付账单等.该站点使用无cookie的ASP会话,允许多个会话在选项卡式浏览器中运行. 站点2)具有标准静态内容的公司网站.这将在每个页面的顶部有一个小表单,其中包含将发布到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.我试过了,但收到了“Error Executing Child Request”消息.

稍后,我在Enabling POST in cookieless ASP.NET Applications上发现了这篇文章.基本上通过绑定到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());

    }
}

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

(编辑:李大同)

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

    推荐文章
      热点阅读