ASP.NET Core使用自定义验证属性控制访问权限详解

ASP.NET Core使用自定义验证属性控制访问权限详解

在 ASP.NET Core 中,自定义验证属性是一种非常常用的方法来控制访问权限,可以通过在代码中使用不同的验证方法来实现不同的访问权限控制。本篇攻略将介绍 ASP.NET Core 中如何使用自定义验证属性控制访问权限。

什么是自定义验证属性

自定义验证属性是一种 ASP.NET Core 中用于验证参数或属性的方法,这些验证方法通常会对输入的参数或属性进行特定的业务逻辑验证。通过使用自定义验证属性,我们可以定义自己的复杂验证规则,然后将这些规则应用在需要进行验证的参数或属性上,如果验证失败,则会抛出异常。当然,自定义验证属性也可以用于控制访问权限。

如何使用自定义验证属性控制访问权限

首先,我们需要创建自定义验证属性类,并重写 AuthorizeAttribute 类的 OnAuthorization 方法。下面是一个使用 AuthorizeAttribute 类定制化权限验证的例子:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    public string[] Roles { get; set; }

    public override void OnAuthorization(AuthorizationFilterContext context)
    {
        if (!context.HttpContext.Request.QueryString.HasValue)
        {
            context.Result = new BadRequestResult();
            return;
        }

        // 验证用户是否具有必要的访问权限
        bool authorized = true;
        if(Roles != null && Roles.Length > 0)
        {
            var user = context.HttpContext.User;
            foreach(var role in Roles)
            {
                if(!user.IsInRole(role))
                {
                    authorized = false;
                    break;
                }
            }
        }

        if(!authorized)
        {
            context.Result = new ForbidResult();
            return;
        }
    }
}

在上面的代码中,我们使用 AttributeUsage 特性自定义了一个名为 CustomAuthorizeAttribute 的验证属性类,并重写了 AuthorizeAttribute 类的 OnAuthorization 方法。该类中包含一个名为 Roles 的属性,用于存储用户允许访问的角色。

OnAuthorization 方法中,我们首先检查传入的 URL 中是否包含查询字符串。如果没有,我们将返回 400 错误。接下来,我们通过 User.IsInRole() 方法验证用户是否具有必要的访问权限。如果用户不具备访问权限,则返回 403 错误。

现在,我们可以在需要验证权限的控制器或操作上使用我们的自定义验证属性:

public class HomeController : Controller
{
    [CustomAuthorize(Roles = "Admin")]
    public IActionResult AdminPage()
    {
        return View();
    }
}

在上面的代码中,我们在 AdminPage 操作上使用了自定义验证属性 CustomAuthorize。该属性会验证用户是否属于 Admin 角色,如果不属于,则返回 403 错误。

示例一

接下来是一个更为具体的例子。我们假设一个网站有两种类型的用户:管理员和普通用户。只有管理员才能够修改用户的权限信息。首先,我们需要定义一个名为 Admin 的角色。然后,我们可以使用我们上面定义的自定义验证属性来限制只有管理员才有修改权限的权利。

1. 创建 Admin 角色

public class ApplicationRoles : IdentityRole
{
}

services.AddDefaultIdentity<IdentityUser>().AddRoles<ApplicationRoles>().AddEntityFrameworkStores<ApplicationDbContext>();

上面的代码将创建一个名为 ApplicationRoles 的继承自 IdentityRole 的角色类。 AddRoles 方法将这个角色添加到服务容器中。

2. 在 CustomAuthorizeAttribute 中进行权限验证

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    public CustomAuthorizeAttribute(ApplicationRoles role)
    {
        Role = role.ToString();
    }

    public CustomAuthorizeAttribute(params ApplicationRoles[] roles)
    {
        Roles = string.Join(",", roles.Select(x=>x.ToString()));
    }

    public string Role { get; set; }
    public string Roles{ get; set; }

    public override void OnAuthorization(AuthorizationFilterContext context)
    {
        if (!context.HttpContext.Request.QueryString.HasValue)
        {
            context.Result = new BadRequestResult();
            return;
        }

        // 验证用户是否具有必要的访问权限
        bool authorized = true;
        if(!string.IsNullOrWhiteSpace(Role))
        {
            var user = context.HttpContext.User;
            if(!user.IsInRole(Role))
            {
                authorized = false;
            }
        }
        else if(!string.IsNullOrWhiteSpace(Roles))
        {
            var user = context.HttpContext.User;
            var userRoles = Roles.Split(",");
            foreach(var role in userRoles)
            {
                if(!user.IsInRole(role))
                {
                    authorized = false;
                    break;
                }
            }
        }

        if(!authorized)
        {
            context.Result = new ForbidResult();
            return;
        }
    }
}

上面的代码中,我们重写了 AuthorizeAttribute 类的 OnAuthorization 方法,并在构造函数中传入了 ApplicationRoles 类型的参数。 在方法中,我们使用 ApplicationRoles 来验证用户是否具有必要的访问权限。

3. 在控制器及操作上使用自定义验证属性

public class AdminController : Controller
{
    [CustomAuthorize(ApplicationRoles.Admin)]
    public IActionResult CreateUser(string username)
    {
        // 只有管理员才有权限创建新用户
    }
}

在上面的代码中,我们在 CreateUser 操作上使用了 CustomAuthorize 自定义验证属性来验证当前用户是否属于 Admin 角色。如果用户不属于 Admin 角色,则返回 403 错误,表示访问受到限制。

示例二

在上面的例子中,我们使用了自定义验证属性来控制用户访问权限。如果您需要使用自定义验证属性来定制化验证规则,则可以借助自定义的定义验证规则实现。下面是一个示例:

public class CustomValidationAttribute : ValidationAttribute
{
    public CustomValidationAttribute()
    {

    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if(value != null && !string.IsNullOrWhiteSpace(value.ToString()))
        {
            int number=0;
            if(!int.TryParse(value.ToString(), out number))
            {
                return new ValidationResult("必须是数字类型");
            }
        }

        return ValidationResult.Success;
    }
}

在上面的代码中,我们定义了一个自定义的验证规则类 CustomValidationAttribute,并重写了它的 IsValid 方法。在该方法中,我们将验证传入的值是否为数字类型。如果不是,则返回错误信息。

下面是我们如何在模型上使用这个自定义验证规则:

public class Product
{
    [CustomValidation]
    public int? Price { get; set; }
}

在上面的代码中,我们在 Price 属性上使用了 CustomValidation 自定义验证规则,以此来控制用户输入的数据是否符合要求。

结论

使用自定义验证属性控制访问权限是 ASP.NET Core 中非常实用的技巧。通过使用自定义验证属性,我们可以定制化不同的验证规则,从而满足我们的具体需求。在本文中,我们通过两个具体的示例来演示了如何使用自定义验证属性来控制访问权限和定制化验证规则。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:ASP.NET Core使用自定义验证属性控制访问权限详解 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • 云计算——云服务器ECS(2)

    一、ECS的产品优势 与普通的IDC(integrated data center)机房或服务器厂商相比,阿里云提供的云服务器ECS的优势: 高可用性     提升可用性的产品和服务,包括云服务器ECS,负载均衡SLB,关系型数据库RDS以及数据迁移服务DTS等     行业伙伴以及生态合作伙伴,可以完成更稳定的架构,并且保证服务的持续性     多种多样的…

    云计算 2023年4月12日
    00
  • 云计算时代的数据库研究

    1 引言 随着云计算时代的到来,各种类型的互联网应用层出不穷,对与此相关的数据模型、分布式架构、数 据存储等数据库相关的技术指标也提出了新的要求。虽然传统的关系型数据库已在数据存储方面占据了不可动摇的地位,但由于其天生的限制,已经越来越无法满足 云计算时代对数据扩展、读写速度、支撑容量以及建设和运营成本的要求。云计算时代对数据库技术提出了新的需求,主要表现在…

    云计算 2023年4月10日
    00
  • ICP币怎么买?ICP币交易和买卖教程全解

    ICP币怎么买?ICP币交易和买卖教程全解 ICP(Internet Computer Protocol)是一个全新的区块链技术,其代币ICP得到了不少投资者的关注。那么,ICP币怎么买?在哪里可以交易ICP币?以下是ICP币交易和买卖的详细教程。 ICP币交易平台 目前,ICP币主要在以下几个交易所上进行交易: Binance Huobi OKEx Gat…

    云计算 2023年5月17日
    00
  • 中国云计算技术大会Container峰会议题征集

    作为中国云计算大数据领域的技术剖析与应用实践年度盛会,2016中国云计算技术大会为期两天半,以“技术与应用,趋势与实践”为主题,除了顶尖技术专家云集的Keynote演讲,还特设了“OpenStack技术峰会”、“Spark技术峰会”、“Container技术峰会”三大技术主题峰会 以及“云计算核心技术架构”、“云计算平台构建与实践”、“大数据核心技术与应用实…

    云计算 2023年4月13日
    00
  • 大话云计算:群雄华山论剑,谁能笑傲江湖

    临近2017年末,云计算群雄纷纷聚集华山开始坐而论道,当然有时也唇枪舌剑。一时间,华山之巅“Cloud Computing”、“Cloud Native”、“Big Data”、“Data Center”、“Artificial Intelligence”、“OpenStack”、“Container”……等各种词汇不绝于耳。 与此同时,最新一期的云计算英雄…

    云计算 2023年4月12日
    00
  • 用Docker作为PaaS的替代方案是否完美无缺

    用Docker作为PaaS的替代方案是否完美无缺 Docker是一种轻量级的容器化技术,可以将应用程序和其依赖项打包到一个容器中,从而实现跨平台、可移植和可重复部署。PaaS(平台即服务)是一种云计算服务模型,可以提供应用程序开发、测试、部署和管理等服务。在某些情况下,Docker可以作为PaaS的替代方案,但是它是否完美无缺呢?下面是一些攻略,包括Dock…

    云计算 2023年5月16日
    00
  • 读书笔记《Hadoop开源云计算平台》

    HDFS-Hadoop Distributed File System,对大文件效率高,小文件效率低。和普通本地的文件系统区别在于HDFS中的文件是分布在多台计算机上的,并且访问文件需要通过HDFS中的NameNode来访问。比如一个文件1g,被分成了10份分别保存在计算机01-10中,当客户端要获取这个文件时,会发生: 客户端request到NameNod…

    云计算 2023年4月11日
    00
  • Asp.net core利用MediatR进程内发布/订阅详解

    Asp.net core利用MediatR进程内发布/订阅详解 在本攻略中,我们将详细讲解Asp.net core利用MediatR进程内发布/订阅的实现方法,包括MediatR的基本概念、使用方法和示例说明。 MediatR基本概念 MediatR是一个轻量级的中介者库,用于在应用程序中实现发布/订阅模式。它可以帮助我们更好地组织和管理应用程序中的业务逻辑…

    云计算 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部