为了简化问题,假设我有具有自定义属性的控制器,如下所示:
[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 响应,然后以某种方式重定向??我不知道。
感谢您的帮助!
有没有办法在不执行逻辑的情况下从属性重定向 内部控制器操作 ?
不要filterContext.HttpContext.Response.Redirect("Login");
.
SetfilterContext.Result = new RedirectResult (or RedirectToRouteResult)
调用。
在IAuthorizationFilter
中,要阻止执行操作代码并重定向到登录页面,应通过更改 AuthorizationFilterContext 的结果来阻止程序进入原始操作,如下所示:
filterContext.Result = new RedirectResult("/Login/Index");
你也可以参考这个。