ASP.NET MVC-授权属性登录重定向后保留POST数据

ASP.NET MVC-授权属性登录重定向后保留POST数据,asp.net,asp.net-mvc,asp.net-mvc-3,forms-authentication,Asp.net,Asp.net Mvc,Asp.net Mvc 3,Forms Authentication,我有一个带有评论的博客帖子页面。 任何用户(无论是否登录)都可以在页面底部看到一个表单来发表评论。 当用户输入评论但未经授权时,用户将被重定向到登录/注册页面。 登录后,用户将重定向回操作,但包含注释正文的POST数据将丢失 我使用ASP.NET MVC Authorize属性要求对某些操作进行授权: [AcceptVerbs(HttpVerbs.Post), Authorize] public ActionResult Create(int blogPostID, string comment

我有一个带有评论的博客帖子页面。 任何用户(无论是否登录)都可以在页面底部看到一个表单来发表评论。 当用户输入评论但未经授权时,用户将被重定向到登录/注册页面。 登录后,用户将重定向回操作,但包含注释正文的POST数据将丢失

我使用ASP.NET MVC Authorize属性要求对某些操作进行授权:

[AcceptVerbs(HttpVerbs.Post), Authorize]
public ActionResult Create(int blogPostID, string commentBody) {
    var comment = new Comment {
       Body = commentBody,
       BlogPostID = blogPostID,
       UserName = User.Identity.Name
    }
    // persist the comment and redirect to a blog post page with recently added comment
}
你如何解决这个问题

我认为在显示评论表单之前让用户登录是个坏主意


谢谢。

您可以使用授权表上的隐藏字段。将用户的评论放在该字段(您的初始帖子数据)。之后,如果授权表单只是重定向到您的评论表单,您仍然无法使用评论表单上的数据。所以,让您的授权表单发布到评论表单,隐藏字段中的数据也会发布,这样您就可以使用它了。

我可能只需将站点ID和评论保存到会话中。然后为create创建另一个重载,该重载不接受任何参数。它检查会话中是否存在这些变量——如果存在,则将其传递给原始的Create方法

要做到这一点,您必须删除Authorize属性,然后自己进行安全检查。大概是这样的:

var user = HttpContext.User;

if (!user.Identity.IsAuthenticated)
{ 
   Session["Comment"] = comment;
   Session["SiteId"] = siteId;
   return RedirectToAction("LogOn", "Account", 
                           new { returnUrl = "/ControllerName/Create"} );
}
然后,您可以创建:

public ActionResult Create()
{
    var comment = (Session["Comment"] ?? "").ToString();
    int siteId = 0;
    if (Session["siteId"] != null)
        siteId = (int)Session["siteId"];

    return Create(siteId, comment);
}

当然,这并不完全是通用的,也不能处理更复杂的场景,但这是一个想法。(希望上面的代码可以工作,我还没有机会测试它)。似乎您可以通过操作过滤器执行类似操作,但我没有任何示例代码。

授权包括OAuth/OpenID选项,可导致重定向到Facebook/Twitter。外部OAuth授权页面不支持“隐藏输入契约”,数据仍然丢失。谢谢,看起来可用。我在最初的问题中将操作参数从“siteId,comment”改为“int-blogPostID,string-commentBody”,但想法很清楚,我决定采用这个解决方案。现在还可以。如果未在所有服务器上填充会话,则web场中可能会出现问题。在这种情况下,我将在没有UserId的数据库中存储注释,并将注释id放入访问者的cookie中,在授权之后,使用授权的UserId更新注释记录。