是否有一个好方法来处理登出时的POST
本文关键字:POST 处理 有一个 方法 是否 | 更新日期: 2023-09-27 18:07:00
我有一个在我的控制器中没有GET操作的Create POST操作。在我的AccountController中,我有一个Login操作,当传递到查询时返回到ReturnUrl。问题是,由于Create没有Get操作,我得到一个404。
你有什么建议吗?-
你可能想看看解释:ASP中的表单身份验证。NET 2.0,它基本上解释了ASP。Net的认证工作,然后使用反射器反汇编
System.Web.dll
中命名空间System.Web.Security
下的FormsAuthenticationModule
和FormsAuthentication
类,以了解ASP是如何实现的。Net Forms Authentication工作并重写它以达到最佳效果。基本上,您需要修改执行重定向的代码以添加以下特性
- 生成一个随机密钥,如
System.Guid.NewGuid()
,提取post数据并将其与请求url一起存储在System.Web.HttpContext.Current.Cache[<key>]
- 将重定向url从
<Path to login page.aspx>?ReturnUrl=<Url>
更改为<Path to login page.aspx?RequestId=<key>
- 认证完成后,根据缓存值进行重定向。如果有任何post数据,生成一个自动post表单(HTML)并返回给客户端,以便原始请求可以继续。
添加请求变量System.Web.Security.FormsAuthentication.RedirectToLoginPage
和System.Web.Security.FormsAuthentication.GetRedirectUrl
可能是你需要编辑的。您可以使用System.Web.HttpContext.Current.Request
这可能是繁琐而微妙的工作,因为微软的代码是如此复杂,如果你不能获得。net源代码(我不确定微软是否还提供)或(免费的)Reflector许可证,这可能是不可能的。
- 生成一个随机密钥,如
-
或者,你可以编写一个自定义IHttpModule,做以下事情:
- 检查每个请求,看看它是否是post action,如果它是
- 提取未认证的post数据,并将数据存储在
Session
变量 中
,
- 为post操作创建一个get操作,该操作返回一个自动返回页面,就像第一个项目的第3点一样。 将模块添加到应用程序中。确保它在
FormsAuthenticationModule
之前执行,否则它将不起作用。
您可以从演练:创建和注册自定义HTTP模块开始。
这个方法可能会导致一些问题,如果您的用户决定在同一时间做多个张贴,因为第二个请求将覆盖Session
中的数据。
以上两种选择是直接处理你的问题的方法。如果将Post控制器更改为Get,可能会更简单。上面的方法是不值得的,除非你有大量的页面遇到同样的问题,或者你想用ASP.Net做实验。