如何在 ASP NET Core 3.1 中的任何控制器的每个方法中 check/redirect?

How to check/redirect in every method of any controller in ASP NET Core 3.1?

我正在寻找一种在每个控制器的每个方法中执行此操作的方法,即使对于那些没有 return IActionResult 的方法(我将在前面讨论这个):

  1. 获取 User.Claim 以获取登录到站点的用户信息。
  2. 检查用户是否在数据库中被阻止(我有自己的存储库已经在工作)
  3. 将用户重定向到显示“您已被阻止”的页面,就像 Exceptions 的工作流程一样。

我已经做过的考虑和尝试:

现在我正在尝试做一个中间件,但我是 NET Core 的新手,在如此深的层次上,所以两者都无法编译。还试图从 ViewStart

调用我的 userRepository

最好的方法是使用中间件。这里有一个例子:

internal class UserMiddleware
{
    private readonly RequestDelegate next;
    private readonly IUserRepository userRepository;

    public UserMiddleware(RequestDelegate next, IUserRepository userRepository)
    {
        this.next = next ?? throw new ArgumentNullException(nameof(next));
        this.userRepository = userRepository ?? throw new ArgumentNullException(nameof(userRepository));
    }

    public async Task Invoke(HttpContext httpContext)
    {
        Claim clientId = httpContext.User.FindFirst(ClaimTypes.NameIdentifier);
        bool isBlocked = await this.userRepository.CheckUser(clientId);

        if (isBlocked)
        {
            await httpContext.Response.WriteAsync("You are blocked.");
            return;
        }

        await this.next(httpContext);
    }
}

那么在你的启动方法中你应该在映射你的控制器之前调用它:

public static void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // Other stuff...

    app.UseMiddleware<UserMiddleware>();
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}