如何覆盖控制器内 Startup class 中定义的 "OnActionExecuting"?
How to override "OnActionExecuting" defined in the Startup class inside a controller?
此代码 运行 用于检查每个传入请求是否包含有效的 JWT 令牌。
services.AddMvc(options =>
options.Filters.Add(typeof(JwtAttribute)));
在大多数情况下,这就是我想要的,除了第一次(当用户尝试登录时)。因为每次请求都是 运行ning,用户无法登录。
我已经尝试在登录操作之上添加一个属性,但它仍然不起作用。
[HttpPost]
[AllowAnonymous]
public async Task<JsonResult> Login([FromBody]Credentials formData)
{
}
在这种情况下,我应该怎么做才能在启动时覆盖 OnActionExecuting class,以便用户可以登录。
感谢您的帮助
通过使用自定义过滤器而不是 built-in 身份验证和授权系统,您将无法在此处使用 [AllowAnonymous]
,因为它直接链接到身份验证框架。
您可以做的是添加额外的元数据,然后将其作为 JwtAttribute
过滤器的一部分进行检查。例如,像这样创建另一个属性:
public class DisableJwtAttribute : Attribute, IFilterMetadata
{ }
您现在可以使用 [DisableJwt]
将此属性添加到您的控制器操作中。
在 JwtAttribute
过滤器内部,您现在可以检查该过滤器是否存在以停止处理请求。例如。如果您的过滤器是授权过滤器,则看起来像这样:
public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
{
if (context.Filters.Any(item => item is DisableJwtAttribute))
return;
// filter is active
}
话虽这么说,更好 的解决方案是采用身份验证系统,让您的 JWT 验证成为正常身份验证过程的一部分。这样,您实际上可以从 ASP.NET Core 中的所有身份验证和授权内容中受益。
此代码 运行 用于检查每个传入请求是否包含有效的 JWT 令牌。
services.AddMvc(options =>
options.Filters.Add(typeof(JwtAttribute)));
在大多数情况下,这就是我想要的,除了第一次(当用户尝试登录时)。因为每次请求都是 运行ning,用户无法登录。
我已经尝试在登录操作之上添加一个属性,但它仍然不起作用。
[HttpPost]
[AllowAnonymous]
public async Task<JsonResult> Login([FromBody]Credentials formData)
{
}
在这种情况下,我应该怎么做才能在启动时覆盖 OnActionExecuting class,以便用户可以登录。
感谢您的帮助
通过使用自定义过滤器而不是 built-in 身份验证和授权系统,您将无法在此处使用 [AllowAnonymous]
,因为它直接链接到身份验证框架。
您可以做的是添加额外的元数据,然后将其作为 JwtAttribute
过滤器的一部分进行检查。例如,像这样创建另一个属性:
public class DisableJwtAttribute : Attribute, IFilterMetadata
{ }
您现在可以使用 [DisableJwt]
将此属性添加到您的控制器操作中。
在 JwtAttribute
过滤器内部,您现在可以检查该过滤器是否存在以停止处理请求。例如。如果您的过滤器是授权过滤器,则看起来像这样:
public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
{
if (context.Filters.Any(item => item is DisableJwtAttribute))
return;
// filter is active
}
话虽这么说,更好 的解决方案是采用身份验证系统,让您的 JWT 验证成为正常身份验证过程的一部分。这样,您实际上可以从 ASP.NET Core 中的所有身份验证和授权内容中受益。