C# .net 核心通过属性重定向,无需计算和控制器操作中的 运行 代码

C# .net core redirect via Attribute, without computing and running code inside controller action

为了简化问题,假设我有带有自定义属性的控制器,如下所示:

[Route("Authenticated")]
[AccessTokenAuthentication]
public async Task<IActionResult> Authenticated()
{
    Console.WriteLine("I dont want to see this if user is not authenticated.");
    return View("AuthenticatedUserView");
}

基于内部逻辑 AccessTokenAuthentication属性如下所示:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class AccessTokenAuthenticationAttribute : Attribute, IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationFilterContext filterContext)
    {
       string Token;
       filterContext.HttpContext.Request.Cookies.TryGetValue("TokenCookie", out Token);
       if (Token != null)
       {
           //from DI Container
           Tokenhelper helper= (Tokenhelper)filterContext.HttpContext.RequestServices.GetService(typeof(Tokenhelper));
           if (helper.IsTokenValid(Token))
           {
               return;
           }
       }
       filterContext.HttpContext.Response.Redirect("Login"); //redirect to login.   
       return;
    }
}

它要么验证用户并打开 AuthenticatedUserView 页面,要么重定向到 Login 页面, 这一切都按预期工作,除非用户被重定向程序仍然执行 Console.WriteLine("I dont want to see this if user is not authenticated.") 行。

有没有一种方法可以在不执行控制器操作内部逻辑的情况下从属性重定向? (也许用 402 或 401 响应,然后以某种方式重定向??)我不知道。

感谢帮助!

Is there a way to redirect from attribute without executing logic inside controller action ?

不要打电话给 filterContext.HttpContext.Response.Redirect("Login");
改为设置 filterContext.Result = new RedirectResult (or RedirectToRouteResult)

IAuthorizationFilter中,为了防止执行action代码重定向到登录页面,应该通过改变AuthorizationFilterContext[=的Result来防止程序进入原来的action 25=],如下图:

 filterContext.Result = new RedirectResult("/Login/Index");

也可以参考.