我有一个基于 MVC4 的 Web 应用程序,并且我有一个表单(通过发布到操作)将多个文件发送到服务器,现在我启用授权方法只处理授权用户。
我的问题是我将[Authorize]
Post Action 放在控制器中,因此文件首先上传到服务器,然后未经授权的用户收到登录消息(将用户重定向到注册/登录页面)。
如果用户未经授权,我想阻止上传文件,所以我需要先检查用户是否是授权用户,然后提交表单。
知道我该怎么做吗?
我有一个基于 MVC4 的 Web 应用程序,并且我有一个表单(通过发布到操作)将多个文件发送到服务器,现在我启用授权方法只处理授权用户。
我的问题是我将[Authorize]
Post Action 放在控制器中,因此文件首先上传到服务器,然后未经授权的用户收到登录消息(将用户重定向到注册/登录页面)。
如果用户未经授权,我想阻止上传文件,所以我需要先检查用户是否是授权用户,然后提交表单。
知道我该怎么做吗?
请记住,在 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 拦截提交,这是一种更深入的实现,但本质上会是这样的:
希望这可以帮助。
不,您在其他地方做错了什么,只需将Authorize
属性用作:
[Authorize]
[HttpPost]
public ActionResult YourController()
{
return View();
}
对于未经授权的用户,它将显示登录消息并将用户重定向到注册/登录页面