注销时是否有一种处理POST的好方法

时间:2011-08-30 22:22:09

标签: c# asp.net-mvc-3

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

你有什么建议吗?

1 个答案:

答案 0 :(得分:0)

  • 您可能希望查看Explained: Forms Authentication in ASP.NET 2.0,它基本上解释了ASP.Net来自身份验证的工作原理,然后使用反射器来反汇编命名空间{{1}下的类FormsAuthenticationModuleFormsAuthenticationSystem.Web.Security中了解ASP.Net Forms身份验证的工作原理并重写它以获得最佳效果。

    基本上,您需要修改重定向的代码以添加以下功能

    1. 生成随机密钥,例如System.Web.dll,提取帖子数据并将其与System.Guid.NewGuid()
    2. 中的请求网址一起存储
    3. 将重定向网址从System.Web.HttpContext.Current.Cache[<key>]更改为<Path to login page.aspx>?ReturnUrl=<Url>
    4. 验证后,根据缓存的值重定向。如果有任何帖子数据,则生成一个自动发布表单(以HTML格式)并将其返回给客户端,以便原始请求可以继续。
    5. <Path to login page.aspx?RequestId=<key>System.Web.Security.FormsAuthentication.RedirectToLoginPage可能是您需要编辑的内容。您可以使用System.Web.Security.FormsAuthentication.GetRedirectUrl

      添加请求变量

      这可能是繁琐而微妙的工作,因为Microsoft代码变得如此复杂,如果你无法获得.Net源代码(我不确定微软是否还提供它)或者(免费)反射器,这可能是不可能的。许可证。

    6. 或者,您可以编写自定义IHttpModule,执行以下操作:

      1. 检查每个请求,看看是否是相关的帖子操作,以及是否
      2. 如果未经过身份验证,则提取发布数据,并将数据存储在System.Web.HttpContext.Current.Request变量
      3. 然后,

        1. 为返回自动回发页面的帖子操作创建一个get动作,就像第一个项目符号中的第3点一样。
        2. 将模块添加到您的应用程序。确保它在Session之前执行,否则将无效。
        3. 您可以从Walkthrough: Creating and Registering a Custom HTTP Module开始。

          如果您的用户决定同时进行多次发布,则此方法可能会导致一些问题,因为第二个请求将覆盖FormsAuthenticationModule中的数据。

以上两种选择是直接处理你问题的方法。如果将Post控制器更改为Get,可能会更容易。上述方法不值得,除非您有大量页面遇到相同的问题或者您想尝试使用ASP.Net。