【问题标题】:How to redirect from ActionFilter to another action or route in Asp.net Core 2.2?如何从 ActionFilter 重定向到 Asp.net Core 2.2 中的另一个操作或路由?
【发布时间】:2019-03-16 07:31:10
【问题描述】:

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

context.ExceptionHandled; //不显示

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

这是我的代码

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)
    {
    
    }
}

在启动/配置服务中

services.AddScoped<ValidaEmpresaActionFilter>();

更新:我找到了答案

刚刚添加了这一行 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);
    }             
}       

【问题讨论】:

  • 感谢您的提问,然后您的回答

标签: asp.net-core


【解决方案1】:

听说我做了[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);

        }
    }

请注意添加这一行:

            await context.Result.ExecuteResultAsync(context);

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

...
        // GET: api/<ValuesController>
        [HttpGet]
        [MyAuth]     // <-------------------
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2", "value3" };
        }
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 2019-06-11
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多