在ASP.Net Core中设置默认全局authorization 授权访问

转载于:https://lebang2020.cn/details/210425aunzrdk3.html

ASP.NET Core 拥有广泛的授权系统,您可以使用该系统创建复杂的授权策略。在这篇文章中,我查看了各种方法,您可以将这些策略应用到你常见的应用程序中。

我们将首先配置一个全局授权过滤器,看看为什么这不再是 ASP.NET Core 3.0+推荐的方法。然后,我们将使用端点路由以及使用Razor Page conventions 将不同的授权策略应用到应用的不同部分,然后查看替代方案。我们还将将默认政策与"后退政策“(一个自定义策略)进行比较,看看何时应用它们,以及如何更新它们。

在这篇文章时,我会假设你有一个标准的Razor Page应用程序,与启动.cs类似的东西。这一点的细节不是很重要,我只是假设你已经为您的应用程序配置了身份验证和UI系统。

public class Startup
{
    public IConfiguration Configuration { get; }
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public void ConfigureServices(IServiceCollection services)
    {
        // Configure ASP.NET Core Identity + EF Core
        services.AddDbContext<AppDbContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))
        );

        services.AddDefaultIdentity<IdentityUser>()
            .AddEntityFrameworkStores<AppDbContext>();

        // Add Razor Pages services
        services.AddRazorPages();

        // Add base authorization services
        services.AddAuthorization();
    }

    public void Configure(IApplicationBuilder app)
    {
        app.UseStaticFiles();

        // Ensure the following middleware are in the order shown
        app.UseRouting();

        app.UseAuthentication();
        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            // Add Razor Pages to the application
            endpoints.MapRazorPages();
        });
    }
}

此时,您具有身份验证,并且您希望开始保护您的应用程序。您可以将[Authorize]属性应用到每个 Razor 页面,但您希望更简单一点,并在全局内将授权应用到程序中的所有页面。这对应本文的其余部分,我们查看可用的各种选项。
使用AuthorizeFilter来全局设置

(1)将授权过滤器在全局应用于您的所有 MVC 操作和Razor页面。这是传统上在早期版本的 ASP.NET 核心中使用的方法。
例如,在配置服务中配置Razor Pages时,您可以将授权过滤器添加到所有Razor Pages操作中(您可以以类似的方式配置 MVC 控制器)

public void ConfigureServices(IServiceCollection services)
{
    // ...other config as before

    // Add a default AuthorizeFilter to all endpoints
    services.AddRazorPages()
        .AddMvcOptions(options => options.Filters.Add(new AuthorizeFilter()));
}

这相当于用[Authorize]属性修饰所有Razor 方法,因此用户有权使用默认政策(下面将对此进行更多介绍!),默认情况下只需要经过验证的用户。如果您未获得身份验证,您将被重定向到Razor Pages应用的登录页面(或者收到 API 的 401 响应)。

如果您想应用不同的策略,您可以在授权过滤器的构造器中指定一个:

public void ConfigureServices(IServiceCollection services)
{
    // ...other config as before

    // Pass a policy in the constructor of the Authorization filter
    services.AddRazorPages()
        .AddMvcOptions(options => options.Filters.Add(new AuthorizeFilter("MyCustomPolicy")));

    // Configure the custom policy
    services.AddAuthorization(options =>
    {
        options.AddPolicy("MyCustomPolicy",
            policyBuilder => policyBuilder.RequireClaim("SomeClaim"));
    });
}

授权筛选器仍然在全局范围内应用,因此用户始终需要登录,但现在他们还必须满足"我的客户政策"政策。如果他们不这样做,他们将被重定向到Razor Pages应用程序的访问被拒绝的页面(或接收API的403)。
请注意:此策略适用于全局,因此您需要确保您的"登录"和"访问"页面有修饰 [AllowAnonymous],否则您最终会获得无尽的重定向。
应用授权过滤器是早期版本的 ASP.NET Core的标准方法,但 ASP.NET Core 3.0 引入了端点路由。端点路由允许将一些以前仅限 MVC 的功能移植为通用功能模块。授权是这些功能之一!

使用RequireAuthorization在endpoint中来启用验证

授权过滤器方法最大的问题是它是仅限 MVC 。ASP.NET Core3.0+为终端设置授权提供了不同的机制—— 在IEndpointConventionBuilder中写了 扩展方法 RequireAuthorization()。
所有可以在Configure方法中配置Endpoins时使用RequireAuthorization()扩展方法就可以配置全局授权验证。

public void ConfigureServices(IServiceCollection services)
{
    // ...other config as before

    // No need to add extra filters
    services.AddRazorPages();

    // Default authorization services
    services.AddAuthorization();
}

public void Configure(IApplicationBuilder app)
{
    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        // Require Authorization for all your Razor Pages
        endpoints.MapRazorPages().RequireAuthorization();
    });
}

其效果与MVC的全局授权过滤器相同。那么为什么要使用这种方法呢?一个很大的优势是能够为其他端点(不是 MVC 或Razor Pages)添加授权。例如,您可能单个指定终点(health)进行身份验证的请求:

app.UseEndpoints(endpoints =>
{
    // Require Authorization for all your Razor Pages
    endpoints.MapRazorPages().RequireAuthorization();
    // Also require authorization for your health check endpoints
    endpoints.MapHealthChecks("/healthz").RequireAuthorization();
});

与以前一样,您可以指定不同的策略,只需要调用RequireAuthorization()。您还可以提供不同的策略来申请不同的端点。在下面的示例中,我将"MyCustomPolicy"策略应用到 Razor 页面端点,并将两个策略"OtherPolicy"和"MainPolicy"应用于”health “端点:

app.UseEndpoints(endpoints =>
{
    // Require Authorization for all your Razor Pages
    endpoints.MapRazorPages().RequireAuthorization("MyCustomPolicy");
    // Also require authorization for your health check endpoints
    endpoints.MapHealthChecks("/healthz").RequireAuthorization("OtherPolicy", "MainPolicy");
});

如果您在RequireAuthorization()中不提供策略名称,则适用默认政策。这与使用没有策略名称的 [Authorize] 过滤器的行为相同。

未完待续。。。。更多内容请去原地址阅读。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ASP.NET Core Authorization是一个集成在ASP.NET Core授权框架,可以用来实现身份验证和授权。下面介绍如何使用ASP.NET Core Authorization来实现身份验证和授权。 1. 配置身份验证 在Startup.cs文件的ConfigureServices方法添加以下代码来配置身份验证: ``` services.AddAuthentication(options => { options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = Configuration["Jwt:Issuer"], ValidAudience = Configuration["Jwt:Audience"], IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"])) }; }); ``` 这段代码使用JWT来进行身份验证,需要提供一个密钥作为签名,可以在appsettings.json配置。 2. 在控制器添加授权 在需要授权的控制器或方法上添加Authorize特性来限制访问: ``` [Authorize(Roles = "admin")] public class AdminController : Controller { // ... } ``` 这段代码限制只有拥有admin角色的用户才能访问AdminController。 3. 配置授权策略 通过配置授权策略,可以更细粒度地控制访问权限。在Startup.cs文件的ConfigureServices方法添加以下代码: ``` services.AddAuthorization(options => { options.AddPolicy("RequireAdminRole", policy => policy.RequireRole("admin")); }); ``` 这段代码配置了一个名为RequireAdminRole的策略,要求用户必须拥有admin角色才能访问。 在控制器或方法上使用Authorize特性指定授权策略: ``` [Authorize(Policy = "RequireAdminRole")] public class AdminController : Controller { // ... } ``` 这段代码限制只有拥有admin角色的用户才能访问AdminController。 以上就是使用ASP.NET Core Authorization来实现身份验证和授权的基本步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值