2013-04-20 61 views
4

在ASP.NET MVC3 Web應用程序中,整個控制器都附有[Authorize]屬性。所以如果用戶沒有登錄或會話過期,他們會被重定向到登錄頁面。這有效。下面的「作品」列表中的網址正確地重定向到登錄頁面; 「不工作」列表中的URL會顯示IIS 401錯誤屏幕 - 它們不會重定向到登錄頁面。如果URL有查詢字符串,AuthorizeAttribute不起作用?

作品

不起作用

MyAction動作模型具有在它的基類一個public string ReturnUrl { get; set; }。它也有其他屬性,但將它們添加到查詢字符串不會影響登錄重定向。它似乎只是ReturnUrl參數。

我不知道還有什麼要看的。任何想法爲什麼ReturnUrl參數會造成麻煩?

路線

routes.MapRoute("Default-Title-ID", "{Controller}/{Action}/{Title}_{ID}", namespaces); 
routes.MapRoute("Default-ID", "{Controller}/{Action}/{ID}", namespaces); 
routes.MapRoute("Default", "{Controller}/{Action}", new { Controller = "Home", Action = "Index" }, namespaces); 
routes.MapPageRoute("Reports-View", "ViewReport_{ID}", "~/Views/Reports/View.aspx"); 

工作實例(好吧,工作,但說明了這個問題。)

這裏下載解決方案:https://docs.google.com/file/d/0B4o6vqgNLpvbeVo4bVdKZWFMcEE/edit?usp=sharing

,然後嘗試請訪問:

+0

尤物。我假設沒有使用異國路線。 – 2013-04-20 03:05:03

+0

@DaveA正常路線 - 將它們添加到上面。 – 2013-04-20 03:07:16

+0

查看這些路線,我懷疑路線引擎變得困惑......'Default-Title-ID'和'Default-Title-ID'之間沒有有效的區別 - 它們都有第三個ID參數,但是當使用url時,路由引擎不知道選擇哪個引擎。 True'Default'是補充,因爲Controller和Action都是可選的,但是這條路線傳統上是作爲2nd 1st的一部分來實現的,以便爲路線引擎提供更大的靈活性。我強烈建議嘗試合併3條路線,然後看看你是否仍然有同樣的問題。 – 2013-04-20 05:34:20

回答

2

我想張貼此評論,但我太長。我需要爲我的一個應用程序動態重定向,並使用以下解決方案(它使用調用它的控制器而不是web.config中的靜態URL)。當用你的例子進行測試時,它解決了這個問題。但我不明白爲什麼。也許它會引導你走向正確的道路或其他人可以澄清。

using System.Web.Mvc; 
using System.Web.Routing; 

namespace MvcApplication1.App_Start 
{ 
    public class LoginRequiredAttribute : AuthorizeAttribute 
    { 
     public override void OnAuthorization(AuthorizationContext filterContext) 
     { 
      base.OnAuthorization(filterContext); 

      if (filterContext.Result is HttpUnauthorizedResult) 
      { 
       filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary 
       { 
        { "controller", filterContext.RouteData.Values[ "controller" ] }, 
        { "action", "Login" }, 
        { "ReturnUrl", filterContext.HttpContext.Request.RawUrl } 
       }); 
      } 
     } 
    } 
} 

然後,只需更改爲使用新屬性的操作:

[LoginRequired] 
public ActionResult TestMe() 
+0

幾年後,我回到了這個問題,並完全忘記了我曾經創建過這個問題,再次創建了同樣的問題(http://stackoverflow.com/questions/29973280/mvc-route-returns- 401-僅-IF-RETURNURL-參數是功能於查詢字符串)。然後我想起了這個最初的問題,實施了你的建議,現在我很開心,因爲它工作。 _但我仍然不知道爲什麼它不在首位。謝謝! – 2015-04-30 17:50:45