在 JwtBearerEvents 中知道是否使用了 [AllowAnonymous]
Know in JwtBearerEvents if [AllowAnonymous] was used
我有两个 JWT 需要处理。一份给用户,一份给应用程序。
我有将其中一个 JWT 设置为“令牌”的逻辑。这是在 JwtBearerEvents
的 OnMessageReceived
方法中完成的。
看起来像这样:
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
检查 IAllowAnonymous
或 AllowAnonymousAttribute
端点上的元数据:
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
。
我有两个 JWT 需要处理。一份给用户,一份给应用程序。
我有将其中一个 JWT 设置为“令牌”的逻辑。这是在 JwtBearerEvents
的 OnMessageReceived
方法中完成的。
看起来像这样:
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
检查 IAllowAnonymous
或 AllowAnonymousAttribute
端点上的元数据:
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
。