如何强制用户使用ASP.NET MVC 4登录以查看任何内容

Ler*_*ica 6 forms-authentication asp.net-mvc-4 simplemembership

我正在研究'ASP.NET MVC 4'应用程序并使用'SimpleMembershipProvider'.该应用程序将在Intranet中使用,并且没有可供未授权用户使用的内容,因此我想在让用户访问实际站点内容之前强制登录.

我认为这应该是一项相当简单的任务,但这是我第一次实施这样的逻辑,而且我也希望这样做,MVC 4/SimpleMemebrship所以我寻求建议.

我认为应该实现的方式是首先在web.config中添加它:

<authentication mode="Forms">
      <forms loginUrl="~/Account/Login" timeout="15" slidingExpiration="true" enableCrossAppRedirects="false" protection="All" />
    </authentication>
Run Code Online (Sandbox Code Playgroud)

毕竟我不会采取允许匿名的行动所以我认为最好把它放在这里.

并将我的默认路由更改为:

 routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Account", action = "Login", id = UrlParameter.Optional }
            );
Run Code Online (Sandbox Code Playgroud)

在我看来,这将是唯一允许匿名的行动.但是我有点担心将默认路由更改为Login我不确定这是否会导致一些意想不到的缺点.

我也有想法保留由创建的默认结构MVC 4 Internet Template,只是让控制器的Index动作Home承担责任,但我不喜欢这种情况,因为逻辑很清楚 - 用户必须登录才能获得任何类型的访问,甚至Home/Index在我的脑海中有一些访问权限.

那么实现这种行为的方式是什么?为实现这一目标,我应该采取哪些基本步骤和变更?

Uro*_*jat 19

您可以通过将Authorize属性注册为全局过滤器来实现此目的.Bellow是您的RegisterGlobalFilters方法应如何显示的示例:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new HandleErrorAttribute());
    filters.Add(new AuthorizeAttribute());
}
Run Code Online (Sandbox Code Playgroud)

有了这个,您将不得不允许匿名用户访问登录页面.为此,您需要使用AllowAnonymous属性注释Login操作方法.

[AllowAnonymous]
[HttpGet]
public ActionResult Login()
{
 ...
}
Run Code Online (Sandbox Code Playgroud)

对接收POST请求的Login操作方法执行相同操作.