我正在开发一个"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>
毕竟,我不会采取允许匿名的行动,所以我认为最好把这个放在这里。
并将我的默认路线更改为:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Account", action = "Login", id = UrlParameter.Optional }
);
在我看来,这将是唯一允许匿名的行动。然而,我有点担心将默认路由更改为Login
,我不确定这是否会导致一些意想不到的缺点。
我还想保留MVC 4 Internet Template
创建的默认结构,只让Home
控制器的Index
操作负责,但我不喜欢这种情况,因为逻辑很清楚——用户必须登录才能获得任何类型的访问权限,甚至Home/Index
在我心目中也是某种访问权限。
那么,实现这种行为的方法是什么呢?为了实现这一权利,我应该采取哪些基本步骤和改变?
您可以通过将Authorize
属性注册为全局过滤器来实现这一点。Bellow是RegisterGlobalFilters
方法的一个示例:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new AuthorizeAttribute());
}
这样一来,您就必须允许匿名用户访问登录页面。为此,您可以使用AllowAnonymous
属性对Login操作方法进行注释。
[AllowAnonymous]
[HttpGet]
public ActionResult Login()
{
...
}
对接收POST请求的Login操作方法执行相同操作。