网络核心应用。我正在使用 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)] 因未经授权而失败。我可以知道根本原因是什么吗?任何帮助,将不胜感激。谢谢
当我将有效令牌传递给具有适当角色的上述 API 时,我的过滤器 正确验证令牌,但行 [Authorize(Roles = RolesConstant.Manager)] 因未经授权而失败。我可以知道会发生什么吗 是根本原因。
嗯,根据您的情况,该未经授权的事件可能会出现几个问题。
首先,您可能知道声明区分大小写,请确保令牌包含预期的角色声明,并且角色声明与 RolesConstant.Manager 值匹配。如果您的令牌声明与您在 JWT 解码器中的配置完全相同,您可以解码您的令牌声明。
另一个重要的一点是,默认情况下,角色声明在 JWT 中通常被命名为“role”。如果它有不同的名称,您需要在 [Authorize] 属性中明确指定它,并仔细检查它是否在您的令牌中包含
RolesConstant.Manager
。
最重要的是,如果支持您发送角色声明的方式,请仔细阅读 forgerock 文档。因为,forgerock 通常允许使用逗号分隔值的声明。因此,请确保您的配置是否正确。
最后相应地检查上述步骤,如果问题仍然存在,请分享您的堆栈跟踪详细信息和
RolesConstant.Manager
详细说明您如何配置它们。