0

我們有一個動作過濾器,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); 
    } 

回答

0

改變代碼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

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

謝謝ivamax9,但此解決方案無法正常工作。也許是因爲我們使用我們的asp.net核心控制器作爲web api控制器。 – ashilon