变更请求路径

问题描述:

我们有一个动作过滤器,ActionAuthorizationFilterAttribute,执行一些授权测试其OnActionExecuting方法(从会话获取其权限,后来更多),和如果测试正常,则返回,如果不是,则设置ForbidResult上下文的结果属性。到现在为止还挺好。但是我们有一种情况,会话在一段空闲时间段后重新为空,并且我们需要将请求路径设置为“/”,而不是用户手动完成,因此例如,如果用户正在尝试在会话结束后访问某个网址,例如http://mydomain/mywebapp/someurl,该方法应该将其返回到http://mydomain/mywebapp/,并且应用程序将再次启动其会话init的东西。这在手工操作时有效,但在方法中不起作用。下面是该方法的代码:变更请求路径

public override void OnActionExecuting(ActionExecutingContext context) 
    { 
     var path = context.HttpContext.Request.Path.Value.Trim().ToLower(); 
     var session = context.HttpContext.Session; 
     var permittedUrls = session.GetJson<List<string>>(SesstionStateKeys.PermittedUrls); 

     if (permittedUrls == null) 
     { 
      context.HttpContext.Request.Path = "/"; 
      return; 
     } 

     if (permittedUrls.Any(url => path.Contains(url.Trim().ToLower()))) 
     { 
      return; 
     } 

     context.Result = new ForbidResult(); //new UnauthorizedResult(); 

     base.OnActionExecuting(context); 
    } 

改变代码Path不会重定向用户新的路径。如果您希望将用户重定向到索引/登录页面,则应返回RedirectResult

对于API最佳选择是返回UnauthorizedResult

+0

我们没有使用ASP.NET Core MVC。我们使用带有Web API的ASP.NET Core,这意味着我们的控制器只是返回数据而不是视图。所有的视图都由Angular和ui-router在客户端处理。您的解决方案能否与我们的设置一起工如果是这样,我需要改变行** context.HttpContext.Request.Path =“/”; ** to ** context.Result = new RedirectResult(“/”); **? – ashilon

+0

如果你想返回你的用户/客户端一些“指令”来“提出索引/登录页面的新请求” - 你应该返回一些东西。你的用户/客户会理解的东西。 “记录”的东西(在您的文档中)。没有这个(只通过改变'Request.Path'),只有你的服务器会“做”某些“其他”,而不是客户端。客户会“认为”他的电话,比如执行“/ api/create/magic”并创建了魔术,但如果用户未经授权(由于会话/凭证过期),则不是这样。 Imho返回'UnauthorizedResult'是您的案例的最佳选择(更新我的答案)。 – Dmitry

public override void OnActionExecuting(ActionExecutingContext context) 
{ 
    var path = context.HttpContext.Request.Path.Value.Trim().ToLower(); 
    var session = context.HttpContext.Session; 
    var permittedUrls = session.GetJson<List<string>>(SesstionStateKeys.PermittedUrls); 

    if (permittedUrls == null) 
    { 
     context.Result = new RedirectResult("your_url"); 
     return; 
    } 

    if (permittedUrls.Any(url => path.Contains(url.Trim().ToLower()))) 
    { 
     return; 
    } 

    context.Result = new ForbidResult(); //new UnauthorizedResult(); 

    base.OnActionExecuting(context); 
} 
+0

谢谢ivamax9,但此解决方案无法正常工作。也许是因为我们使用我们的asp.net核心控制器作为web api控制器。 – ashilon