如何从 ActionFilter 重定向到 Asp.net Core 2.2 中的另一个操作或路由?

Gle*_*vel 7 asp.net-core

如何重定向ActionFilter到 Asp.net Core 2.2 中的另一个控制器/操作

上下文.异常处理; //不显示

我已经尝试了这些线程的所有选项:

这是我的代码

public class ValidaEmpresaActionFilter : IActionFilter
{
    private readonly UserManager<ApplicationUser> _userManager;
    private readonly IHttpContextAccessor _contextAccessor;

    public ValidaEmpresaActionFilter(UserManager<ApplicationUser> userManager, IHttpContextAccessor contextAccessor)
    {
        _userManager = userManager;
        _contextAccessor = contextAccessor; 
    }

    public async void OnActionExecuting(ActionExecutingContext context)
    {
        string username = _contextAccessor.HttpContext.User.Identity.Name;
        var user = await  _userManager.FindByNameAsync(username);

        // all options i tried Option 1
        if (user.EmpresaPrincipal == null || user.EmpresaPrincipal < 1)
        {

            RouteValueDictionary redirectTargetDictionary = new RouteValueDictionary();
            redirectTargetDictionary.Add("action", "Index");
            redirectTargetDictionary.Add("controller", "Home");

            context.Result = new RedirectToRouteResult(redirectTargetDictionary);
        }
        // option #2
        if (user.EmpresaPrincipal == null || user.EmpresaPrincipal < 1)
            context.Result = new RedirectResult("~/Home/index");
       
        // option #3
        if (user.EmpresaPrincipal == null || user.EmpresaPrincipal < 1)
        {
            context.Result = new RedirectToRouteResult(
            new RouteValueDictionary
            {
                { "controller", "Home" },
                { "action", "Index" }
            });
        }
    }

    public void OnActionExecuted(ActionExecutedContext context)
    {
    
    }
}
Run Code Online (Sandbox Code Playgroud)

在启动/配置服务中

services.AddScoped<ValidaEmpresaActionFilter>();
Run Code Online (Sandbox Code Playgroud)

更新:我找到了答案

刚刚添加了这一行 await context.Result.ExecuteResultAsync(context);

这是结果代码:

public async void OnActionExecuting(ActionExecutingContext context)
{
    string username = _contextAccessor.HttpContext.User.Identity.Name;
    var user = await  _userManager.FindByNameAsync(username);

    if (user.EmpresaPrincipal == null || user.EmpresaPrincipal < 1)
    {
        RouteValueDictionary redirectTargetDictionary = new RouteValueDictionary();
        redirectTargetDictionary.Add("action", "Index");
        redirectTargetDictionary.Add("controller", "Home");
        redirectTargetDictionary.Add("area", "");

        context.Result = new RedirectToRouteResult(redirectTargetDictionary);
        await context.Result.ExecuteResultAsync(context);
    }             
}       
Run Code Online (Sandbox Code Playgroud)

Pey*_*idi 2

听说我做了[MyAuth]操作过滤器,如果身份验证通过,则继续,否则重定向到“访问被拒绝”页面

    public class MyAuth : ActionFilterAttribute
    {

        public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            var headers = context.HttpContext.Request.Headers;
            if(headers.ContainsKey("Authentication"))
            {
                var value = AuthenticationHeaderValue.Parse(headers["Authentication"]);
                var bytes = Convert.FromBase64String(value.Parameter);
                var crendentials = Encoding.UTF8.GetString(bytes).Split(":");
                var username = crendentials[0];
                var password = crendentials[1];
                
                if(Validate(username, password))
                {
                    // user is valid, huuuray
                    base.OnActionExecutionAsync(context, next);
                    return;

                }

            }
            // should redirect to somewhere
            context.Result = new RedirectResult("~/api/access_deny");
            await context.Result.ExecuteResultAsync(context);

        }
    }
Run Code Online (Sandbox Code Playgroud)

请注意添加这一行:

            await context.Result.ExecuteResultAsync(context);
Run Code Online (Sandbox Code Playgroud)

在我的 Api 控制器中的某个地方,在执行任何操作之前都需要我的自定义[MyAuth]

            await context.Result.ExecuteResultAsync(context);
Run Code Online (Sandbox Code Playgroud)