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

Posted

技术标签:

【中文标题】使用路由参数的 DotNet Core 自定义授权属性【英文标题】:DotNet Core Custom Authorize Attribute using Route Params 【发布时间】:2020-11-20 05:26:27 【问题描述】:

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

我现在是 DotNet 核心。我目前正在创建一个应用程序只是为了练习。我注意到,在我的大多数 API 操作中,我正在根据声明 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。

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

提前谢谢你。

【问题讨论】:

这可能会有所帮助***.com/questions/31464359/… 【参考方案1】:

我能够通过执行以下操作来解决我的问题:

[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();
        
    

【讨论】:

您能说明一下您是如何将它添加到控制器操作/方法中的吗?

以上是关于使用路由参数的 DotNet Core 自定义授权属性的主要内容,如果未能解决你的问题,请参考以下文章

如何在启动时使用 dotnet core 3 中的依赖项调用自定义服务?

.NET Core授权失败如何自定义响应信息?

如何在 dotnet core Web Api 中返回自定义错误消息

Web api dotnet core 中的 Api 版本控制错误的自定义错误响应

如何创建不依赖于 ASP.NET Core 声明的自定义 Authorize 属性?

ASP.NET Core 使用 JWT 自定义角色/策略授权需要实现的接口