📜  auth 权限检查的自定义属性 .net - C# (1)

📅  最后修改于: 2023-12-03 14:59:25.337000             🧑  作者: Mango

使用自定义属性进行身份验证的 .NET C# 应用

在 .NET C# 应用中,使用自定义属性可以方便地实现身份验证,这种方式可以大大减少代码复杂性和重复性,提高开发效率。本篇介绍如何利用自定义属性实现身份验证。

身份验证流程

常见的身份验证流程如下:

  1. 用户尝试访问应用程序中需要验证的资源。
  2. 应用程序验证用户的凭证,如用户名和密码等,来确定用户的身份。
  3. 如果用户通过验证,则应用程序检查该用户是否拥有访问所需资源的权限。
  4. 如果用户拥有足够的权限,则应用程序向用户提供所需资源。
属性的定义和使用

在 .NET C# 中,使用自定义属性可以很方便地实现身份验证。

首先,定义一个 Attribute 类型,用于验证用户的身份。

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public class AuthAttribute : Attribute
{
    public string Role { get; set; }

    public AuthAttribute(string role)
    {
        this.Role = role;
    }
}

然后,在需要验证身份的方法上方添加 Attribute 标记。在运行时,可以使用反射来检查方法是否附加了这个标记。

[Auth("Admin")]
public IActionResult AdminPage()
{
    // 只有拥有 "Admin" 角色的用户才能访问这个方法

    return View();
}

此时,需要验证用户的身份和权限。解析Attribute 可以执行这项工作。检查是否存在具有访问所需资源的有效凭证的用户,代码可以根据传递的 Attribute 和认证中心(通常是身份验证令牌)执行此操作。如下:

public static bool IsValidAuthorization(AuthAttribute attribute, ClaimsPrincipal claimsPrincipal)
{
    if (!claimsPrincipal.Identity.IsAuthenticated) /// 如果用户没有通过身份验证,则返回false
        return false;

    if (attribute == null)
        return true; 

    if (string.IsNullOrEmpty(attribute.Role))
        return true; 

    if (claimsPrincipal.HasClaim(c => c.Type == ClaimTypes.Role && c.Value == attribute.Role)) /// 如果用户的角色与属性值相匹配,则返回true
        return true;

    return false;
}

在上面的例子中,IsValidAuthorization 函数使用 ClaimsPrincipal 对象和传递的 Attribute 来验证用户的身份和权限。

总结

在 .NET C# 应用中,使用自定义属性可以方便地实现身份验证。结合反射机制使代码变得简洁和易于理解。通过这种方式,可以有效减轻繁琐的身份验证代码。