我有一个MVC 5站点(基于nopCommerce),我需要强制所有用户登录。我过去用其他语言完成它的方式是检查页面标题(所以它在每个页面)如果用户登录,如果不登录则重定向到登录页面。但是,我不知道在MVC中实现这一目标的正确方法。我发现其他答案说重定向在MVC中不是一件好事,这很好,但我无法弄清楚如何正确地完成这个。如何将所有未授权用户重定向到登录页面?
答案 0 :(得分:5)
你可以添加" AuthorizeAttribute" in" RegisterGlobalFilter"在App_Start中,如下所示:
public class FilterConfig
{
public static void RegisterGlobalFilter(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new AuthorizeAttribute());
}
}
并且在Global.asax的Application_Start中,您应该注册此过滤器:
protected void Application_Start()
{
FilterConfig.RegisterGlobalFilter(GlobalFilters.Filters);
.
.
.
}
以及您不需要用户注册的每个控制器,您可以使用" AllowAnonymous"控制器中的操作属性如下:
[AllowAnonymous]
public ActionResult Login()
{
//do something
}
有关详情,请点击此Link
答案 1 :(得分:2)
您需要使用Authorize属性。
关于重定向,来自MSDN:
如果未经授权的用户尝试访问标记为的方法 在Authorize属性中,MVC框架返回401 HTTP状态 码。如果站点配置为使用ASP.NET窗体身份验证, 401状态代码导致浏览器将用户重定向到 登录页面。
因此,您可以在 web.config 中对登录视图应用重定向,或者如果您正在使用ASP.NET表单身份验证,那么它应该根据需要重定向到登录页面。
有四种实现Authorize属性的方法,全局,每个控制器,每个控制器方法或每个视图。
<强>全局:强>
您可以添加&#34; AuthorizeAttribute&#34; in&#34; RegisterGlobalFilter&#34;在App_Start中,如下所示:
public class FilterConfig
{
public static void RegisterGlobalFilter(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new AuthorizeAttribute());
}
}
并且在Global.asax的Application_Start中,您应该注册此过滤器:
protected void Application_Start()
{
FilterConfig.RegisterGlobalFilter(GlobalFilters.Filters);
. . .
}
每个控制器:
[Authorize]
public class AccountController : Controller
{
. . .
}
按控制器方法:
public class AccountController : Controller
{
. . .
[AllowAnonymous]
public ActionResult Register() { . . . }
[Authorize]
public ActionResult Manage() { . . . }
. . .
}
每次观看:
<!-- With razor syntax -->
<script type="text/javascript>
@if(!Request.IsAuthenticated) {
window.location.href = redirectURL;
}
</script>
<!-- Without razor syntax -->
<script type="text/javascript>
<% if(!Request.IsAuthenticated) { %>
window.location.href = redirectURL;
<% } %>
</script>
Iraj的全球方法回答。
答案 2 :(得分:1)
如果您想授权所有控制器,您可以这样做...
在Global.asax中放入Application_Start
GlobalFilters.Filters.Add(new AuthorizeAttribute());