在ASP.NET Core中更改动作过滤器中的请求路径

时间:2016-12-29 07:29:20

标签: c# asp.net-web-api asp.net-core windows-authentication action-filter

我们有一个动作过滤器, ActionAuthorizationFilterAttribute ,它在 OnActionExecuting 方法中执行一些授权测试(从会话中获取其权限,以后更多),如果测试没问题,只返回,如果没有,它会在上下文的结果属性中设置 ForbidResult 。到现在为止还挺好。但是我们有一种情况,在一些空闲时间段之后会话重新为空权限,我们需要将请求路径设置为" /" ,而不是用户手动执行此操作,例如,如果用户在会话结束后尝试访问某个URL,如http://mydomain/mywebapp/someurl,则该方法应将其返回http://mydomain/mywebapp/,应用程序将启动其会话初始化内容再次。这可以在手动完成时起作用,但它在该方法中起作用。这是方法的代码:

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

2 个答案:

答案 0 :(得分:0)

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

对于API,最佳选项是返回UnauthorizedResult

答案 1 :(得分:0)

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