
在 ASP.NET Core 中创建自定义授权属性
在早期版本的 ASP.NET Core 中,创建自定义授权属性需要重写 AuthorizeAttribute
中的 bool AuthorizeCore(HttpContextBase httpContext)
方法。然而,这种方法在当前框架版本中已不再适用。
创建自定义 AuthorizeAttribute 的新方法
现在,创建自定义授权属性的推荐方法是使用新的“策略”设计。这种设计使用 [Authorize]
属性来指定策略,该策略可以在应用程序的 Startup.cs
文件中定义。然后,可以将策略链接到特定的代码块,例如确保用户满足某些声明要求。
虽然策略设计提供了灵活性,但它可能并不适用于所有场景,尤其是在只需要简单声明要求时。对于这种情况,自定义解决方案可能更实用。
实现自定义声明要求属性
一种方法是使用 IAuthorizationFilter
接口,它允许您插入自定义过滤器以强制执行声明要求。以下代码演示了一个示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | public class ClaimRequirementAttribute : TypeFilterAttribute
{
public ClaimRequirementAttribute(string claimType, string claimValue) : base(typeof(ClaimRequirementFilter))
{
Arguments = new object[] { new Claim(claimType, claimValue) };
}
}
public class ClaimRequirementFilter : IAuthorizationFilter
{
private readonly Claim _claim;
public ClaimRequirementFilter(Claim claim)
{
_claim = claim;
}
public void OnAuthorization(AuthorizationFilterContext context)
{
var hasClaim = context.HttpContext.User.Claims.Any(c => c.Type == _claim.Type && c.Value == _claim.Value);
if (!hasClaim)
{
context.Result = new ForbidResult();
}
}
}
|
登录后复制
通过使用此自定义属性,您可以为特定的控制器或操作声明要求,如下例所示:
1 2 3 4 5 6 7 8 9 10 | [Route( "api/resource" )]
public class MyController : Controller
{
[ClaimRequirement(MyClaimTypes.Permission, "CanReadResource" )]
[HttpGet]
public IActionResult GetResource()
{
return Ok();
}
}
|
登录后复制
以上是如何在ASP.NET Core中创建自定义授权属性?的详细内容。更多信息请关注PHP中文网其他相关文章!