【问题标题】:Change request path in action filter in ASP.NET Core在 ASP.NET Core 的操作过滤器中更改请求路径
【发布时间】:2016-12-29 07:29:20
【问题描述】:

我们有一个动作过滤器,ActionAuthorizationFilterAttribute,它在其 OnActionExecuting 方法中执行一些授权测试(从会话中获取其权限,稍后会详细介绍),如果测试没问题,它只是返回,如果没有,它会在上下文的 Result 属性上设置 ForbidResult。到现在为止还挺好。但是我们有一种情况,会话在某个空闲时间段后为权限返回 null,我们需要将请求路径设置为 "/",而不是用户手动执行此操作,所以例如,如果用户在会话结束后尝试访问某个 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);
    }

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 我们没有使用 ASP.NET Core MVC。我们使用带有 Web API 的 ASP.NET Core,这意味着我们的控制器只返回数据,而不是视图。所有视图都由 Angular 和 ui-router 在客户端处理。您的解决方案是否适用于我们的设置?如果是这样,我需要将行 context.HttpContext.Request.Path = "/"; 更改为 context.Result = new RedirectResult("/"); ?
    • 如果您想向您的用户/客户端返回一些“指令”以“向索引/登录页面发出新请求” - 您应该返回一些内容。您的用户/客户会理解的东西。 “记录”的东西(在您的文档中)。没有这个(只有通过改变Request.Path)只有你的服务器会“做”一些“其他”的事情,而不是客户端。客户将“认为”他的调用,例如,执行“/api/create/magic”并创建了魔法,但如果用户未经授权(由于会话/凭据过期),则不是真的。恕我直言,返回 UnauthorizedResult 是您案件的最佳决定(更新了我的答案)。
    【解决方案2】:
    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);
    }
    

    【讨论】:

    • 谢谢 ivamax9,但这个解决方案不起作用。可能是因为我们使用我们的 asp.net 核心控制器作为 web api 控制器。
    猜你喜欢
    • 2020-05-20
    • 2021-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多