【问题标题】:How to check/redirect in every method of any controller in ASP NET Core 3.1?如何在 ASP NET Core 3.1 中任何控制器的每个方法中检查/重定向?
【发布时间】:2021-04-09 22:30:13
【问题描述】:

我正在寻找一种在每个控制器的每个方法中执行此操作的方法,即使对于那些不返回 IActionResult 的方法(我将继续讨论):

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

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

  • 无法从声明中获取此信息以便与 ViewStart 一起使用,因为我需要该块在数据库更新的同一时刻工作。用户退出并登录时的声明。

  • 无法通过返回带有 Json 的布尔值的控制器来执行此操作 每个页面,因为用户可以停止重定向

  • 我有几个方法可以返回局部视图、对象、列表,除了 IActionResult 之外的任何东西。我不在乎这是否不起作用,原因有两个:

    • 应该由通过 ajax 调用的主视图触发。
    • 用户无论如何都被阻止了,所以我不在乎它是否看到页面损坏。
  • 我的安全工作流程是这样的:

    [HttpPost]
    [Authorize(Policy = "Users")]
    [Authorize(AuthenticationSchemes = "MyAppScheme")]
    
    public IActionResult GetRep() {
         //Do things
    }
    

现在我正在尝试做一个中间件,但我是 NET Core 的新手,所以我也无法编译。也在尝试从 ViewStart 调用我的 userRepository

【问题讨论】:

  • 你为什么不使用可以在你的应用程序中全局工作的中间件。动作过滤器将是最佳选择Chekc MS Docs
  • @RabbyHasan 谢谢!是的,我正在尝试,但不知道如何正确完成

标签: c# asp.net asp.net-core asp.net-core-middleware


【解决方案1】:

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

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();
    });
}

【讨论】:

  • 现在我遇到了几个问题,“在前一个操作完成之前,在此上下文上启动了第二个操作。这通常是由使用相同 DbContext 实例的不同线程引起的。有关如何避免 DbContext 线程问题的更多信息,请参阅go.microsoft.com/fwlink/?linkid=2097913。'
  • 不知道为什么,因为我在做 Usuarios user = await _context.Users.Where(u => u.Guid == guid && u.Deleted == 0 && u.Blocked == 0).FirstAsync ();
猜你喜欢
  • 2023-02-22
  • 2021-03-30
  • 2020-09-14
  • 2021-06-25
  • 2018-01-29
  • 2020-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多