在 JwtBearerEvents 中知道是否使用了 [AllowAnonymous]

Know in JwtBearerEvents if [AllowAnonymous] was used

我有两个 JWT 需要处理。一份给用户,一份给应用程序。

我有将其中一个 JWT 设置为“令牌”的逻辑。这是在 JwtBearerEventsOnMessageReceived 方法中完成的。

看起来像这样:

OnMessageReceived = context =>
{
    var headers = context.Request.Headers;
    context.Token = headers[primaryJwtHeaderKey];
                
    return Task.CompletedTask;
}

[AllowAnonymous] 外,这很好用。 [AllowAnonymous] 仍然采用 AuthorizationOptions.FallbackPolicy 的逻辑,但使其不具有约束力。

但这意味着当它通过上面的方法运行时,我无法知道调用是 [AllowAnonymous] 调用还是实际上是我的后备策略。

我需要知道当 [AllowAnonymous] 调用通过时,如果另一个为空,我会选择其中一个 JWT。 (这意味着如果没有用户 JWT,那么我将令牌设置为应用程序 JWT。)但我应该只在调用是匿名调用时才这样做。 (否则我可能会允许一个应该被阻止的呼叫。)

有没有办法知道 [AllowAnonymous] 是否来自 JwtBearerOptions.JwtBearerEvents.OnMessageReceived 事件?

如果该方法是匿名通过的,则不会有与 HttpContext 关联的身份名称。

OnMessageReceived = context =>
{
    if (context.HttpContext.User?.Identity.?Name == null) {
        ...
    }
}

您也可以试试:

context.HttpContext.User?.Identity?.IsAuthenticated

检查 IAllowAnonymousAllowAnonymousAttribute 端点上的元数据:

opt.Events = new JwtBearerEvents
{
    OnMessageReceived = ctx =>
    {
        // This will be null if not anonymous, otherwise, it will be
        // the metadata instance such as AllowAnonymousAttribute
        var allowAnonymous = ctx.HttpContext.GetEndpoint()
            .Metadata.GetMetadata<IAllowAnonymous>();
    }
};

如果您还使用 MVC 过滤器,也可以检查 IAllowAnonymousFilter