我们有一个动作过滤器, 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);
}
答案 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);
}