如何使用 ForgeRock 在 .Net core 中进行角色授权

问题描述 投票:0回答:1

网络核心应用。我正在使用 forgerock jwt 身份验证。我正在尝试使用授权过滤器来实现授权。下面是我的授权过滤器代码

public class JwTFilter : Attribute, IAsyncAuthorizationFilter
    {
        private readonly IAuthService _authService;

        public JwTFilter(IAuthService authHandler)
        {
            this._authService = authHandler;
        }
        async Task IAsyncAuthorizationFilter.OnAuthorizationAsync(AuthorizationFilterContext context)
        {
            var jwt = context.HttpContext.Request.Headers["Authorization"].ToString();
            context.HttpContext.Request.Headers.TryGetValue("Authorization", out var authorizationHeader);
            var stopwatch = Stopwatch.StartNew();

            if (string.IsNullOrWhiteSpace(authorizationHeader))
            {
            }

            AuthenticationHeaderValue authHeader = AuthenticationHeaderValue.Parse(authorizationHeader);

            if (!authHeader.Scheme.Equals("Bearer", StringComparison.OrdinalIgnoreCase))
            {
            }
            if (string.IsNullOrWhiteSpace(authHeader.Parameter))
            {

            }

            var result = await _authService.ValidateAndBuildUserCalims(authHeader.Parameter);

            stopwatch.Stop(); // Stop the stopwatch

            return;
        }
    }

在上面的代码中,方法 _authService.ValidateAndBuildUserCalims(authHeader.Parameter) 验证令牌。我有以下控制器

 [Authorize(Roles = RolesConstant.Manager)]
        public async Task<DetailDto> GetTestData()
        {
            DetailDto data= new DetailDto();
            return data;
        }

我在program.cs中添加了过滤器,如下所示

builder.Services.AddControllers(options =>
{
    options.Filters.Add<JwTFilter>();
});

当我使用正确的角色将有效令牌传递给上述 API 时,我的过滤器会正确验证令牌,但行 [Authorize(Roles = RolesConstant.Manager)] 因未经授权而失败。我可以知道根本原因是什么吗?任何帮助,将不胜感激。谢谢

c# asp.net-core jwt authorization
1个回答
0
投票

当我将有效令牌传递给具有适当角色的上述 API 时,我的过滤器 正确验证令牌,但行 [Authorize(Roles = RolesConstant.Manager)] 因未经授权而失败。我可以知道会发生什么吗 是根本原因。

嗯,根据您的情况,该未经授权的事件可能会出现几个问题。

首先,您可能知道声明区分大小写,请确保令牌包含预期的角色声明,并且角色声明与 RolesConstant.Manager 值匹配。如果您的令牌声明与您在 JWT 解码器中的配置完全相同,您可以解码您的令牌声明。

另一个重要的一点是,默认情况下,角色声明在 JWT 中通常被命名为“role”。如果它有不同的名称,您需要在 [Authorize] 属性中明确指定它,并仔细检查它是否在您的令牌中包含

RolesConstant.Manager

最重要的是,如果支持您发送角色声明的方式,请仔细阅读 forgerock 文档。因为,forgerock 通常允许使用逗号分隔值的声明。因此,请确保您的配置是否正确。

最后相应地检查上述步骤,如果问题仍然存在,请分享您的堆栈跟踪详细信息和

RolesConstant.Manager
详细说明您如何配置它们。

© www.soinside.com 2019 - 2024. All rights reserved.