MVC 4 ||身份||如何禁用提交未授权用户的表单?

时间:2014-07-27 22:22:26

标签: forms asp.net-mvc-4 asp.net-identity authorize

我有一个基于MVC4的网络应用程序,我有一个表单,发送(通过邮件到一个动作)将文件多个文件到服务器,现在我启用授权方法只处理授权用户。

我的问题是我将[Authorize]放在控制器中的Post Action之前,因此首先将文件上传到服务器,而不是未授权的用户获取登录的消息(将用户重定向到寄存器/登录页面)。

如果用户未经授权,我想阻止上传文件,因此我需要以某种方式检查用户是否是授权用户,然后提交表单。

知道我该怎么办?

2 个答案:

答案 0 :(得分:1)

请记住,在MVC架构中,默认情况下,每个操作都可以无状态调用/重放 - 也就是说,格式正确的请求将执行相应的操作,以便AuthorizeAttribute和其他此类属性将成为仅在确定适当的行动后才进行评估。实际上,这不是MVC的一个特性,因为它通常是Web架构的一个特性。

文件上传与任何其他POST ed值一样,因为它是作为请求的一部分发送的。现在,您可能有一个异步(ajax)文件上传控件,但即使在这种情况下,文件上传仍然只是另一个普通的请求。

MVC无法选择您的客户是否决定向其发送大请求或小请求或任何请求。 MVC只能响应客户选择的请求。

毫无疑问,在[Authorize]行动之前,您应该POST。但是为了防止用户花时间上传文件,只有在POST被拒绝,您还应该在UI中做一些事情来阻止或阻止用户在未经过身份验证时轻松提出此类请求。

换句话说,您需要对客户端进行编程以与服务器协同工作,以确定是否鼓励用户上传。

您可以做的一件简单事情就是检查User.Identity.IsAuthenticated并在真实时显示表单:

@if (User.Identity.IsAuthenticated)
{
    // display form razor
}
else
{
    // display login razor
}

您还可以使用JavaScript拦截提交,这是一个更深层次的实现,但基本上会是这样的:

  1. 在提交时,检查用户是否经过身份验证(可能涉及即时服务器端呼叫,或者如果合适,您可以依赖客户端来确定)
  2. 如果未经过身份验证,请阻止提交,而是显示登录模式
  3. 希望这有帮助。

答案 1 :(得分:0)

不,你在其他地方做错了,只需使用Authorize属性:

[Authorize]
[HttpPost]
public ActionResult YourController()
{
  return View();
}

对于未经授权的用户,它将显示要登录的消息并将用户重定向到注册/登录页面