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



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

[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");

你也可以参考这个。

相关内容

最新更新