如何在整个asp.net MVC应用程序中要求授权

本文关键字:应用程序 授权 MVC net asp | 更新日期: 2023-09-27 18:15:04

我创建了一个应用程序,其中除了那些允许登录的操作之外的每个操作都应该超出未登录用户的限制。

我应该在每个类的标题前添加[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();
        }
    }
}

或者有快捷方式吗?如果我想为特定控制器中的一个动作改变规则该怎么办?

如何在整个asp.net MVC应用程序中要求授权

最简单的方法是在过滤器配置中添加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属性,当您需要它可以访问非登录用户

DavidG的答案为基础,如果您需要一个特定的角色(例如,在Windows authentication中,每个人都被授权),您可以这样做:

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
        filters.Add(new AuthorizeAttribute { Roles = "MyApp Access" });
    }
}

我知道OP被标记为只有asp.net-mvc-5,但为了完整性,为ASP。. NET Core MVC 6,如果你正在构建带有视图的控制器(通过builder.Services.AddControllersWithViews()),有两种方法可以要求整个应用程序的授权:

  1. 设置授权策略
    namespace DL.Poc.Identity.Server
    {
        public class Program
        {
            public static void Main(string[] args)
            {
                var builder = WebApplication.CreateBuilder(args);
                ...
                builder.Services.AddControllersWithViews();
                builder.Services.AddAuthorization(options =>
                {
                    options.FallbackPolicy = new AuthorizationPolicyBuilder()
                        .RequireAuthenticatedUser()
                        .Build();
                });
                var app = builder.Build();
                ...
                app.UseAuthorization();
                app.MapControllerRoute(
                    name: "areaRoute",
                    pattern: "{area:exists}/{controller=home}/{action=index}/{id?}");
                app.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=home}/{action=index}/{id?}");
                app.Run();
            }
        }
    }
    
  2. 添加授权过滤器
    namespace DL.Poc.Identity.Server
    {
        public class Program
        {
            public static void Main(string[] args)
            {
                var builder = WebApplication.CreateBuilder(args);
                ...
                builder.Services.AddControllersWithViews(options =>
                {
                    var policy = new AuthorizationPolicyBuilder()
                     .RequireAuthenticatedUser()
                     .Build();
                    options.Filters.Add(new AuthorizeFilter(policy));
                });
                var app = builder.Build();
                ...
                app.UseAuthorization();
                app.MapControllerRoute(
                    name: "areaRoute",
                    pattern: "{area:exists}/{controller=home}/{action=index}/{id?}");
                app.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=home}/{action=index}/{id?}");
                app.Run();
            }
        }
    }