变更请求路径
问题描述:
我们有一个动作过滤器,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
。
答
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
我们没有使用ASP.NET Core MVC。我们使用带有Web API的ASP.NET Core,这意味着我们的控制器只是返回数据而不是视图。所有的视图都由Angular和ui-router在客户端处理。您的解决方案能否与我们的设置一起工如果是这样,我需要改变行** context.HttpContext.Request.Path =“/”; ** to ** context.Result = new RedirectResult(“/”); **? – ashilon
如果你想返回你的用户/客户端一些“指令”来“提出索引/登录页面的新请求” - 你应该返回一些东西。你的用户/客户会理解的东西。 “记录”的东西(在您的文档中)。没有这个(只通过改变'Request.Path'),只有你的服务器会“做”某些“其他”,而不是客户端。客户会“认为”他的电话,比如执行“/ api/create/magic”并创建了魔术,但如果用户未经授权(由于会话/凭证过期),则不是这样。 Imho返回'UnauthorizedResult'是您的案例的最佳选择(更新我的答案)。 – Dmitry