使用路由参数的 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 中的依赖项调用自定义服务?
如何在 dotnet core Web Api 中返回自定义错误消息
Web api dotnet core 中的 Api 版本控制错误的自定义错误响应