使用路由参数的 DotNet Core 自定义授权属性

DotNet Core Custom Authorize Attribute using Route Params

我用谷歌搜索了这个,没有找到任何东西,所以我想从使用 DotNet Core 的时间比我长的人那里知道。

我现在进入 DotNet 核心。我目前正在创建一个应用程序只是为了练习。我注意到在我的大多数 Apis 操作中,我正在根据声明 NameIdentifier(即登录的用户 ID)验证传入的 UserId。

我是这样做的:

        if (userId != int.Parse(User.FindFirst(ClaimTypes.NameIdentifier).Value))
        {
            return Unauthorized();
        }

但是现在想想,还是有点太重复了。有没有办法改用属性?

类似于:

    [AuthorizeUser(UserId = userid)]
    [HttpGet]
    public async Task<IActionResult> GetSomething(int userId)
    {
            //Custom code ...
    }

然后创建我的授权属性:

public class AuthorizeUser : AuthorizeAttribute, IAuthorizationFilter
{
    public AuthorizeUser(params string[] args)
    {
        Args = args;
    }

    public string[] Args { get; }

    public void OnAuthorization(AuthorizationFilterContext context)
    {
        //Custom code ...
    }
}

这样我会在一个地方检查在 "api/user/{userId}" 中传递的用户 ID,用于我的所有操作。

或者有另一种方法可以让我的代码看起来更漂亮并且减少复制和粘贴?

提前致谢。

我通过执行以下操作解决了我的问题:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class UserAuthorizationAttribute : AuthorizeAttribute, IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationFilterContext context)
    {
        // Here I can get userId from my params.
        var userId = context.RouteData.Values["userId"].ToString();

        // It is then being checked against current user claims.
        // The user is only authorized if the userId is equals to ClaimsType.Value and claims Type is equals to NameIdentifier. 
        var isUserAuthorized = context.HttpContext.User.Claims.Any(c => c.Type == ClaimTypes.NameIdentifier && c.Value == userId);
        
        if (!isUserAuthorized)
        {
            context.Result = new UnauthorizedResult();
        }
    }
}