是否有一个好方法来处理登出时的POST

本文关键字:POST 处理 有一个 方法 是否 | 更新日期: 2023-09-27 18:07:00

我有一个在我的控制器中没有GET操作的Create POST操作。在我的AccountController中,我有一个Login操作,当传递到查询时返回到ReturnUrl。问题是,由于Create没有Get操作,我得到一个404。

你有什么建议吗?

是否有一个好方法来处理登出时的POST

  • 你可能想看看解释:ASP中的表单身份验证。NET 2.0,它基本上解释了ASP。Net的认证工作,然后使用反射器反汇编System.Web.dll中命名空间System.Web.Security下的FormsAuthenticationModuleFormsAuthentication类,以了解ASP是如何实现的。Net Forms Authentication工作并重写它以达到最佳效果。

    基本上,您需要修改执行重定向的代码以添加以下特性

    1. 生成一个随机密钥,如System.Guid.NewGuid(),提取post数据并将其与请求url一起存储在System.Web.HttpContext.Current.Cache[<key>]
    2. 将重定向url从<Path to login page.aspx>?ReturnUrl=<Url>更改为<Path to login page.aspx?RequestId=<key>
    3. 认证完成后,根据缓存值进行重定向。如果有任何post数据,生成一个自动post表单(HTML)并返回给客户端,以便原始请求可以继续。

    System.Web.Security.FormsAuthentication.RedirectToLoginPageSystem.Web.Security.FormsAuthentication.GetRedirectUrl可能是你需要编辑的。您可以使用System.Web.HttpContext.Current.Request

    添加请求变量

    这可能是繁琐而微妙的工作,因为微软的代码是如此复杂,如果你不能获得。net源代码(我不确定微软是否还提供)或(免费的)Reflector许可证,这可能是不可能的。

  • 或者,你可以编写一个自定义IHttpModule,做以下事情:

    1. 检查每个请求,看看它是否是post action,如果它是
    2. 提取未认证的post数据,并将数据存储在Session变量

    ,

    1. 为post操作创建一个get操作,该操作返回一个自动返回页面,就像第一个项目的第3点一样。
    2. 将模块添加到应用程序中。确保它在FormsAuthenticationModule之前执行,否则它将不起作用。
  • 您可以从演练:创建和注册自定义HTTP模块开始。

    这个方法可能会导致一些问题,如果您的用户决定在同一时间做多个张贴,因为第二个请求将覆盖Session中的数据。

以上两种选择是直接处理你的问题的方法。如果将Post控制器更改为Get,可能会更简单。上面的方法是不值得的,除非你有大量的页面遇到同样的问题,或者你想用ASP.Net做实验。