C# ASP.NET MVC4-限制未登录用户的所有页面

C# ASP.NET MVC4-限制未登录用户的所有页面,c#,asp.net-mvc,security,authentication,C#,Asp.net Mvc,Security,Authentication,我正在使用ASP.NETMVC4构建一个简单的intranet web应用程序。我已经建立了一个登录系统,并将RouteConfig.cs配置为将登录视图显示为“主页” 我的问题很简单:如果“访问者”没有登录,他们就无法访问其他视图。为了执行测试,我尝试通过url直接访问这些页面,它可以正常工作。如何通过阻止对所有页面(登录页面除外)的访问来确保安全 我读过一些关于Web.config和授权的文章,但没有任何效果。有人帮忙吗 编辑:正如Khanh TO所说,使用AutorizeAttribute

我正在使用ASP.NETMVC4构建一个简单的intranet web应用程序。我已经建立了一个登录系统,并将RouteConfig.cs配置为将登录视图显示为“主页”

我的问题很简单:如果“访问者”没有登录,他们就无法访问其他视图。为了执行测试,我尝试通过url直接访问这些页面,它可以正常工作。如何通过阻止对所有页面(登录页面除外)的访问来确保安全

我读过一些关于Web.config和授权的文章,但没有任何效果。有人帮忙吗

编辑:正如Khanh TO所说,使用AutorizeAttribute是最好的方法。然而,我仍然有一个小问题。当我以简单用户的身份登录时,我应该无法看到管理页面(事实就是这样),但当我尝试这样做时,它会将我重定向到登录页面(我已经登录了!)。我认为这是因为下面的代码。问题是,如果用户试图尝试未经授权的页面,我想重定向到主页。有可能吗

以下是我所说的代码:

<authentication mode="Forms">
      <forms loginUrl="~/User/Login" timeout="2880" />
</authentication>


此外,我想明确指出,我的用户存储在一个简单的表中,其中的角色由bool类型定义(isAdmin以了解用户是否为管理员)。

如果需要对某些页面选择性地应用授权,请使用on controller或action方法:

示例代码:

 [Authorize]
 public class SecuredController : Controller
  {
       public ActionResult Index()
       {
            return View();
       }

  }
或:

引自:

当您使用AuthorizeAttribute标记一个操作方法时,可以访问该方法 操作方法仅限于同时经过身份验证和身份验证的用户 经授权的。如果使用该属性标记控制器,则所有操作 控制器中的方法受到限制

Authorize属性允许您指示授权仅限于预定义角色或单个用户。这让你对谁拥有高度的控制权 被授权查看网站上的任何页面

如果未经授权的用户 尝试访问用Authorize属性标记的方法, MVC框架返回401HTTP状态代码。如果网站是 配置为使用ASP.NET窗体身份验证,401状态代码 使浏览器将用户重定向到登录页面

如果需要全局应用authorize属性(登录页面除外)。您可以将authorized属性添加到全局筛选器,如下所示:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
  {
      filters.Add(new AuthorizeAttribute());
  }
并应用于您的登录视图:

public class AccountController : Controller
    {
        [AllowAnonymous]
        public ActionResult Login()
        {
            return View();
        }
    }
在web.config中,启用表单身份验证:

<authentication mode="Forms">
      <forms loginUrl="~/Account/Login" timeout="2880" />
</authentication>


谢谢您的帮助!你能(或其他人)看看我编辑的帖子吗?我还有一个小问题。@Traffy:首先,如果我们将来有更多的角色,使用布尔值不是一个可伸缩的解决方案。要在asp.net mvc中执行角色授权,您可以查看以下讨论:@Traffy:如果需要重定向用户,使用表单身份验证是正确的解决方案。表单身份验证模块从AuthorizeAttribute截取401,并将其转换为302,以重定向用户,正如我在回答中引用的那样。
<authentication mode="Forms">
      <forms loginUrl="~/Account/Login" timeout="2880" />
</authentication>