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技术站