ASP.NET Core 中授权过滤器(Authorization Filters)

news/2025/2/4 13:44:04/文章来源:https://www.cnblogs.com/51net/p/18698159

ASP.NET Core 中,授权过滤器(Authorization Filters)是用于在请求到达控制器操作方法之前,验证用户是否具有执行该操作的权限的一种机制。授权过滤器的主要作用是确保用户在访问控制器或操作方法时,已通过身份验证并且有足够的权限。

授权过滤器的工作原理

授权过滤器在 ASP.NET Core 中通常由IAuthorizationFilter 接口实现,或者通过更高级的授权机制(如AuthorizeAttribute)进行配置。授权过滤器的执行时机位于所有其他类型过滤器之前,这意味着它们是第一个检查请求权限的过滤器。

1. 使用内置的[Authorize] 特性

[Authorize] 是 ASP.NET Core 中最常用的授权过滤器特性。它可以应用于控制器或操作方法,指示该操作需要特定的用户身份验证或授权。

基本用法:

  1. 全局授权:可以在Startup.cs 中配置,要求所有控制器或操作都需要授权。

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllersWithViews(options =>
        {
            // 将授权过滤器应用于所有控制器和操作
            options.Filters.Add(new AuthorizeFilter());
        });
    }
  2. 控制器级别授权:将[Authorize] 特性应用于整个控制器,意味着控制器中的所有操作都需要授权。

    [Authorize]
    public class MyController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }

        public IActionResult About()
        {
            return View();
        }
    }
  3. 操作级别授权:将[Authorize] 特性应用于单个操作方法,只要求特定操作需要授权。

    public class MyController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }

        [Authorize]
        public IActionResult About()
        {
            return View();
        }
    }

控制授权策略:

除了使用默认的[Authorize] 特性外,还可以根据特定的策略或角色进行授权。例如,你可以创建一个策略并将其与[Authorize] 特性结合使用。

// 在 Startup.cs 中配置授权策略
public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthorization(options =>
    {
        options.AddPolicy("AdminOnly", policy => policy.RequireRole("Admin"));
    });

    services.AddControllersWithViews();
}

然后在控制器或操作方法中使用此策略:

[Authorize(Policy = "AdminOnly")]
public IActionResult AdminDashboard()
{
    return View();
}

2. 自定义授权过滤器

除了使用[Authorize] 特性,ASP.NET Core 允许你创建自定义的授权过滤器,以便在请求管道中进行更多定制化的授权检查。

2.1 实现IAuthorizationFilter 接口

你可以通过实现IAuthorizationFilter 接口来创建一个自定义授权过滤器。这个接口定义了一个方法OnAuthorization,它会在请求进入控制器之前调用。

using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc;
using System;

publicclassCustomAuthorizationFilter : IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationFilterContext context)
    {
        // 检查用户是否已认证
        if (context.HttpContext.User == null || !context.HttpContext.User.Identity.IsAuthenticated)
        {
            context.Result = new UnauthorizedResult();  // 返回 401 未授权
        }
        else
        {
            // 执行其他自定义授权逻辑
            var userRole = context.HttpContext.User.FindFirst("Role")?.Value;
            if (userRole != "Admin")
            {
                context.Result = new ForbidResult();  // 返回 403 禁止访问
            }
        }
    }
}

2.2 注册自定义授权过滤器

Startup.cs 中将自定义过滤器添加到服务容器:

public void ConfigureServices(IServiceCollection services)
{
    // 添加自定义授权过滤器
    services.AddControllersWithViews(options =>
    {
        options.Filters.Add(new CustomAuthorizationFilter());
    });
}

这样,CustomAuthorizationFilter 就会应用于所有的控制器和操作方法。如果你只希望它应用于特定的控制器或方法,可以像使用[Authorize] 特性一样,应用自定义过滤器:

[ServiceFilter(typeof(CustomAuthorizationFilter))]
public class MyController : Controller
{
    public IActionResult Index()
    {
        return View();
    }
}

3. 异步授权过滤器

IAuthorizationFilter 接口有一个异步版本IAsyncAuthorizationFilter,它用于处理需要异步操作(例如查询数据库、调用外部服务等)的授权检查。你只需要实现OnAuthorizationAsync 方法。

using Microsoft.AspNetCore.Mvc.Filters;
using System.Threading.Tasks;

publicclassCustomAsyncAuthorizationFilter : IAsyncAuthorizationFilter
{
    public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
    {
        // 异步检查用户授权
        var userIsAuthorized = await CheckUserAuthorizationAsync(context.HttpContext.User);
        if (!userIsAuthorized)
        {
            context.Result = new UnauthorizedResult();
        }
    }

    private async Task<boolCheckUserAuthorizationAsync(ClaimsPrincipal user)
    {
        // 假设我们通过异步操作检查用户权限
        await Task.Delay(100); // 模拟异步操作
        return user.IsInRole("Admin");
    }
}

4. 使用Policy 进行细粒度授权控制

通过定义授权策略(Authorization Policy),你可以在授权过滤器中做更细粒度的控制,例如根据用户的角色、声明等来决定是否允许访问某个资源。

4.1 配置授权策略

Startup.cs 中,你可以定义策略:

public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthorization(options =>
    {
        // 定义一个 "AdminOnly" 策略,要求用户拥有 "Admin" 角色
        options.AddPolicy("AdminOnly", policy => policy.RequireRole("Admin"));
    });
    
    services.AddControllersWithViews();
}

4.2 在控制器或操作方法中应用授权策略

[Authorize(Policy = "AdminOnly")]
public IActionResult AdminOnlyAction()
{
    return View();
}

5. 全局授权过滤器

你可以在Startup.cs 中配置全局授权过滤器,使得所有的控制器和操作方法都应用某个授权规则。例如:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews(options =>
    {
        // 使所有操作都需要授权
        options.Filters.Add(new AuthorizeFilter("AdminOnly"));
    });
}

总结

  • [Authorize] 特性:最简单的授权方式,可以应用于控制器或操作方法。
  • 自定义授权过滤器:实现IAuthorizationFilter 或IAsyncAuthorizationFilter 接口,进行更复杂的授权逻辑。
  • 授权策略:允许你为不同的操作定义复杂的授权规则,例如根据角色或声明进行控制。
  • 全局授权过滤器:可以在整个应用中应用一个授权策略。

授权过滤器的使用可以灵活地控制用户对资源的访问权限,在应用中根据需要选择适合的授权机制,确保安全性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/878538.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Roo Code插件搭配DeepSeek快速创建项目示例

一、环境准备 1. 安装VSCode 访问 Visual Studio Code官网 下载并安装最新版本 2. 安装IDEA(运行Java项目) 访问IDEA官网下载并安装最新Community社区版二、Roo Code插件配置 1. 安装插件打开VSCode扩展市场(Ctrl+Shift+X) 搜索 "Roo Code" 安装官方插件(确认发…

电子书查找阅读教程

免责声明本文仅作学习交流,对于喜欢的作者,建议支持正版。软件下载Github发布地址:https://github.com/gedoor/legado/releases 完整教学:https://www.yuque.com/legado/wiki/xz直接浏览器打开选择最新版本下载即可书源导入喵工资订阅源:https://dy.miaogongzi.cc/直接浏览…

性能测试会被AI替代吗?

最近,deepseek火了,不少测试小伙伴忧心忡忡,担心测试岗位被替代 我个人观点是:经验类测试技术短期内还是很难被替代的。大家也可以问问deepseek或者其它ai,我们来看下deepseek的观点: 附文字版:性能测试是否会被AI替代,取决于具体的测试场景、技术发展阶段以及人类与…

Java Stream 流

目录概述StreamOptional开始管道中间管道(中间操作)终止管道(终端操作)常用的 Stream 操作方法匹配(Match)查找(Find)遍历(ForEach)过滤(Filter)映射(Map)扁平映射(FlatMap)截断(Limit)跳过(Skip)排序(Sorted)去重(Distinct)汇总(Collect)归约(Redu…

R9000P能连接wifi但无法上网

问题描述:前一晚还正常使用,第二天打开就不能上网,可以连接WiFi,切换过不同WiFi都一样,排除WiFi原因,此时浏览器显示找不到DNS,估计就是dns解析出了问题 解决办法:先去CMD下,输入ipconfig /flushdns 再控制面板->网络和Internet->找到下图,点击WLAN点击属性,双…

PCIe扫盲——TLP Header详解(二)

下面用几个具体的例子来讲解TLP Header的格式与作用。因为内容较多,所以分为多篇文章分别进行介绍。第一篇(即本文)介绍IO Request、Memory Request和Configuration Request。第二篇文章(即TLP Header详解三)介绍Completion ,第三篇文章(即TLP Header详解四)介绍Messag…

PCIe扫盲——TLP Header详解(一)

事务层包(TLP)的一般格式如下图所示:前面的文章介绍过,TLP Header为3DW或者4DW,Data Payload为1-1024DW,最后的TLP Digest(ECRC)是可选的,为1DW。 TLP Header在整个TLP的位置如下图所示,需要注意的是,TLP Header的格式和内容都会随着TLP的类型和路由方式的改变而改变…

龙哥量化:deepseek写技术指标,deepseek写选股公式,通达信deepseek写公式太牛了

龙哥微信:Long622889代写通达信技术指标、选股公式(通达信,同花顺,东方财富,大智慧,文华,博易,飞狐)代写期货量化策略(TB交易开拓者,文华8,金字塔) 2025的deepseek火出天际了,用来写技术指标,量化策略岂不是爽歪歪,哈哈 先说使用体验, 第一:写代码确实很强,…

这个记录一下,困扰了很久,usb网卡被隐藏。

这个问题困扰了很久,直到今天用了这个搜索。才发现问题,照做之后,usb网卡回来了。终于笔记本不用在连网线了,只连typtc扩展坞就可以了。没想到禁用之后,还被隐藏!!! 解决的链接。 https://blog.csdn.net/ljason1993/article/details/85884992

docker中提示permission denied

docker中使用mount命令报错:mount: permission denied使用docker exec -it dokcerID bash进入docker容器中,显示的是root,权限应该是足够,但是使用mount命令一直提示permission denie,很明显是权限不足造成的查看docker历史版本文档,发现docker在0.6之后引入了privileged…

使用Chainlit快速构建一个对话式人工智能应用体验DeepSeek-R1

Chainlit是一个开源的 Python 包,用于构建可用于生产的对话式人工智能。 DeepSeek-R1 是一款强化学习(RL)驱动的推理模型,解决了模型中的重复性和可读性问题。在 RL 之前,DeepSeek-R1 引入了冷启动数据,进一步优化了推理性能。它在数学、代码和推理任务中与 OpenAI-o1 表…