首页 >后端开发 >C++ >如何使用索赔中的ASP.NET Core中实现自定义授权?

如何使用索赔中的ASP.NET Core中实现自定义授权?

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-02-01 18:16:10338浏览

How to Implement Custom Authorization in ASP.NET Core Using Claims?

在ASP.NET Core中使用声明实现自定义授权属性

背景

ASP.NET Core 的 AuthorizeAttribute 提供了一种基于声明授权操作的便捷方法。然而,在之前的版本中,您可以重写 bool AuthorizeCore(HttpContextBase httpContext) 来实现自定义授权逻辑。此方法在 AuthorizeAttribute 中不再存在。

使用策略的当前方法

ASP.NET Core 团队建议使用策略进行自定义授权。以下是流程:

  1. Startup.cs 中定义策略:

    <code class="language-csharp"> options.AddPolicy("YourPolicyName", policy => policy.RequireClaim(...));</code>
  2. [Authorize] 属性添加到您的操作或控制器:

    <code class="language-csharp"> [Authorize(Policy = "YourPolicyName")]
     public IActionResult Action(...)</code>

使用声明的自定义授权属性

如果基于策略的方法不适用,您可以使用 IAuthorizationFilter 接口创建一个自定义 AuthorizeAttribute

<code class="language-csharp">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)
    {
        bool hasClaim = context.HttpContext.User.Claims.Any(c => c.Type == _claim.Type && c.Value == _claim.Value);
        if (!hasClaim)
        {
            context.Result = new ForbidResult();
        }
    }
}</code>

使用方法示例:

<code class="language-csharp">[Route("api/resource")]
public class MyController : Controller
{
    [ClaimRequirement(MyClaimTypes.Permission, "CanReadResource")]
    [HttpGet]
    public IActionResult GetResource()
    {
        return Ok();
    }
}</code>

通过在您的过滤器中实现 OnAuthorization 方法,您可以根据声明指定授权逻辑。

以上是如何使用索赔中的ASP.NET Core中实现自定义授权?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn