【问题标题】:Authorize attribute does not preserve post data授权属性不保留帖子数据
【发布时间】:2012-04-08 22:51:13
【问题描述】:

为了在使用控制器方法上的 [Authorize] 属性后保留发布数据,然后将用户重定向到登录页面,然后在成功验证后将用户重定向到他们打算去的地方 - 如何这能做到吗?默认情况下不中继原始表单提交。对之前帖子的回复说:

您需要将表单值和 RedirectUrl 序列化到隐藏字段。 身份验证后,反序列化隐藏字段中的数据并根据 RedirectUrl 的值进行重定向。 您将需要一个自定义的 Authorize 类来处理这个问题。

我的问题是——有什么例子可以进一步指出我正确的方向吗?是的,我可以将 [Serialize] 标签添加到控制器类,但我不知道创建自定义 Authorize 类有什么帮助?我在网上看到很多关于创建自定义 Authorize 类的材料,但是反序列化在哪里进行呢?如果你能更深一层或两层,那将有很大帮助。我是新手。

(我会评论之前的帖子,但我是该网站的新手,还没有积累足够的积分。我也会放一个指向其他帖子的链接,但它说新用户也不能显示链接!)

【问题讨论】:

  • 如果提交表单本身需要授权,为什么还要显示表单?为什么不把 [Authorize] 属性放在表单的显示动作上呢?
  • 我认为在某些情况下,他需要为授权用户和未授权用户显示表单。例如,在论坛中显示搜索框,但只有注册用户有权进行搜索。跨度>
  • 我同意 Johannes Setiabudi 的观点。我认为尝试在整个身份验证过程中保留 POST 数据的想法是一个坏主意。 POST 应该是一个简单/轻松的过程有很多原因。将该进程拖出许多请求是一个坏主意。XSS 浮现在脑海中(更不用说其他会话/cookie 安全问题)。 @Marwan:另外,恕我直言,“搜索框”是一个不好的例子-如果用户无权搜索,则不应将搜索表单呈现到页面。 Html 助手非常适合有条件地呈现授权的 UI 元素。

标签: asp.net-mvc post attributes authorize


【解决方案1】:

您可以创建一个自定义授权属性,将表单发布的值存储在 Session 字典中,然后在授权完成后,您可以从 Session 字典中重新获取值。
这是一个例子:

public class CustomAuth:AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
      var form = filterContext.HttpContext.Request.Form;
      if (form.HasKeys()) {
       foreach(var key in form.AllKeys)
       {
         filterContext.HttpContext.Session[key]= form[key];
       }
      }
      base.OnAuthorization(filterContext);
    }
}

如您所见,在授权之前,所有表单值都存储在会话中。
现在授权完成后,您可以恢复所有值。

[CustomAuth()]
public ActionResult Admin()
{
   // supposing you had a from input with the name "Name"
   string Name = Session["Name"] ?? string.Empty;

   return View();
}

【讨论】:

    猜你喜欢
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-28
    • 2012-11-17
    相关资源
    最近更新 更多