【问题标题】:How require authorization within whole ASP .NET MVC application如何在整个 ASP .NET MVC 应用程序中要求授权
【发布时间】:2014-07-26 12:20:00
【问题描述】:
我创建的应用程序除了启用登录的操作之外的每个操作都应该超出未登录用户的限制。
我应该在每个班级的标题前添加[Authorize] 注释吗?喜欢这里:
namespace WebApplication2.Controllers {
[Authorize]
public class HomeController : Controller {
public ActionResult Index() {
return View();
}
public ActionResult About() {
ViewBag.Message = "Your application description page.";
return View();
}
public ActionResult Contact() {
ViewBag.Message = "Your contact page.";
return View();
}
}
}
或者有一个捷径?如果我想为特定控制器中的一个且唯一的操作更改规则怎么办?
【问题讨论】:
标签:
c#
asp.net
authorization
asp.net-mvc-5
【解决方案1】:
最简单的方法是在过滤器配置中添加Authorize 属性以将其应用于每个控制器。
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
//Add this line
filters.Add(new AuthorizeAttribute());
}
}
另一种方法是让所有控制器都从基类继承。这是我经常做的事情,因为几乎总是有一些我的所有控制器都可以使用的共享代码:
[Authorize]
public abstract class BaseSecuredController : Controller
{
//Various methods can go here
}
现在你的所有控制器都应该继承这个新类,而不是从 Controller 继承:
public class MySecureController : BaseSecuredController
{
}
注意:当您需要非登录用户访问时,不要忘记添加AllowAnonymous 属性。
【解决方案2】:
以DavidG 的回答为基础,如果您需要某个角色(例如,在Windows authentication 中,每个人都被授权),您可以这样做:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new AuthorizeAttribute { Roles = "MyApp Access" });
}
}