自定义授权属性-ASP .NET Core 2.2

hu

我想创建一个自定义Authorize属性,以便在失败时能够发送个性化响应。有很多例子,但是我找不到我想要的东西。注册策略时,我添加了“声明”。是否可以访问自定义属性中的已注册声明,而不必通过参数传递声明?还是可以知道是否已检查索赔,如果没有,则返回个性化答复?谢谢!

public static void AddCustomAuthorization(this IServiceCollection serviceCollection)
{
    serviceCollection.AddAuthorization(x =>
    {
        x.AddPolicy(UserPolicy.Read,
            currentPolicy => currentPolicy.RequireClaim(UserClaims.Read));
    });
}

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)]
public class CustomAuthorizeAttribute : AuthorizeAttribute, IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationFilterContext authorizationFilterContext)
    {
        if (authorizationFilterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            if (!authorizationFilterContext.HttpContext.User.HasClaim(x => x.Value == "CLAIM_NAME")) // ACCESS TO REGISTER CLAIM => currentPolicy => currentPolicy.RequireClaim(UserClaims.Read)
            {
                authorizationFilterContext.Result = new ObjectResult(new ApiResponse(HttpStatusCode.Unauthorized));
            }
        }
    }
}

[HttpGet]
[CustomAuthorizeAttribute(Policy = UserPolicy.Read)]
public async Task<IEnumerable<UserDTO>> Get()
{
    return ...
}
阿尔伯特·克

您可以使用IAuthorizationPolicyProvider获取策略,然后使用ClaimsAuthorizationRequirement.ClaimType获取索赔名称。并且由于它具有异步API,因此最好使用IAsyncAuthorizationFilter而不是IAuthorizationFilter尝试这个:

public class CustomAuthorizeAttribute : AuthorizeAttribute, IAsyncAuthorizationFilter
{
    public async Task OnAuthorizationAsync(AuthorizationFilterContext authorizationFilterContext)
    {
        var policyProvider = authorizationFilterContext.HttpContext
            .RequestServices.GetService<IAuthorizationPolicyProvider>();
        var policy = await policyProvider.GetPolicyAsync(UserPolicy.Read);
        var requirement = (ClaimsAuthorizationRequirement)policy.Requirements
            .First(r => r.GetType() == typeof(ClaimsAuthorizationRequirement));

        if (authorizationFilterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            if (!authorizationFilterContext.HttpContext
              .User.HasClaim(x => x.Value == requirement.ClaimType))
            {
                authorizationFilterContext.Result = 
                   new ObjectResult(new ApiResponse(HttpStatusCode.Unauthorized));
            }
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

自定义授权属性asp.net core

自定义授权属性不允许在 asp.net core 3 中授权

如何创建自定义授权属性以检查Asp.Net Core中的角色和url路径?

2个属性的浮动范围Asp .Net Core之间的自定义验证

从ASP.net Core 2中的视图访问自定义ApplicationUser属性

在 asp.net core 2 中向 ClaimsPrincipal 用户添加自定义属性

如何使用AuthorizationHandlerContext访问ASP.NET Core 2基于自定义策略的授权中的当前HttpContext

在ASP.NET MVC上的自定义授权属性

自定义授权属性无法在asp.net中使用

自定义模型活页夹未针对ASP.NET Core 2中的单个属性触发

在自定义授权属性(.NET Core 2.2和Jason Web令牌)中,IsAuthenticated始终为false

具有权限代码的ASP.NET MVC 4自定义授权属性(无角色)

Asp.net Core MVC 授权属性不阻塞

通用授权属性多个角色 ASP.NET Core

自定义角色的Asp Net Core 3.1授权

ASP.Net Core的自定义承载令牌授权

asp.net core mvc 中的自定义授权

具有复杂模型的asp.net Core 2自定义模型活页夹

ASP.NET Core 2.x样板中的自定义HTTP响应

在 Asp.Net Core 中实现自定义的 2 因素身份验证机制

ASP.NET Core 2-身份-具有自定义角色的DI错误

ASP.Net Core 2忽略本地请求的JWT授权

如何通过将表中存储的用户ID与Asp.net MVC 5中的当前用户ID进行比较来创建自定义授权属性?

AutoMapper Asp.Net Core 2:未映射的属性

ASP.Net Core 2 ServiceProviderOptions.ValidateScopes属性

Asp.Net Core自定义授权始终以401未经授权结尾

用于ASP.NET Core 2.x中间件的自定义依赖项注入解析器?

ASP.NET Core 2:缺少ApplicationInsights

ASP.NET Core 2:UserManager与DbContext