Forms MVC 4 | |标识| |如何禁用未经授权用户提交表单?

Forms MVC 4 | |标识| |如何禁用未经授权用户提交表单?,forms,asp.net-mvc-4,asp.net-identity,authorize,Forms,Asp.net Mvc 4,Asp.net Identity,Authorize,我有一个基于MVC4的web应用程序,我有一个表单,可以向服务器发送(通过发送到动作)多个文件,现在我启用了授权方法,只处理授权用户 我的问题是,我将[Authorize]放在控制器的Post操作之前,因此文件首先上载到服务器,然后未经授权的用户获得要登录的消息(将用户重定向到注册/登录页面) 如果用户未经授权,我想阻止上传文件,因此我需要先检查用户是否为授权用户,然后提交表单 知道我该怎么做吗?不,您在其他地方做错了什么,只需使用Authorize属性作为: [Authorize] [Http

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

我的问题是,我将
[Authorize]
放在控制器的Post操作之前,因此文件首先上载到服务器,然后未经授权的用户获得要登录的消息(将用户重定向到注册/登录页面)

如果用户未经授权,我想阻止上传文件,因此我需要先检查用户是否为授权用户,然后提交表单


知道我该怎么做吗?

不,您在其他地方做错了什么,只需使用
Authorize
属性作为:

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

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

记住,在MVC体系结构中,默认情况下,每个操作都可以无状态调用/重放-即,格式良好的请求将命中相应的操作,因此只有在识别出相应的操作后才会对
AuthorizeAttribute
和其他此类属性进行评估。实际上,这不是MVC的一个特性,而是web体系结构的一个特性

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

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

毫无疑问,在执行
POST
操作之前,您应该有一个
[Authorize]
。但是,为了防止用户花费时间上传文件,但在发布
后被拒绝,您还应该在UI中采取措施,阻止或防止用户在未经身份验证的情况下轻易提出此类请求

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

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

@if (User.Identity.IsAuthenticated)
{
    // display form razor
}
else
{
    // display login razor
}
您还可以使用JavaScript拦截提交,这是一个更深入的实现,但本质上是这样的:

  • 提交时,检查用户是否经过身份验证(可能涉及服务器端动态调用,或者如果合适,您可以依靠客户端来确定)
  • 如果未通过身份验证,则阻止提交,而是显示登录模式

  • 希望这有帮助。

    在此处发布控制器代码。。