2009-11-06 97 views
0

當試圖在ASP.NET MVC 2預覽應用[RequireHttps]到AccountController.Logon失敗時在MVC預覽2 2我得到以下錯誤:申請AccountController.LogOn

ASP.NET檢測無效URL中的字符。

這是因爲ASP.NET改寫從

http://example.com/admin我的要求

https://example.com/account/logon%3FReturnUrl=/admin

這是ASP.NET本身已加入ReturnURL(不ASP.NET MVC)但它是RequireHttps屬性重定向和搞亂了URL。

%3F而不是?正在打破頁面。

我認爲它在技術上是ASP.NET中的一個錯誤。有沒有解決方法? 我在想也許是一種方法來處理global.asax中'未經身份驗證'的事件 - 或者可能只是修復RequireHttpsAttribute的源代碼。

[RequireHttps] 
    public ActionResult LogOn() 
    { 
     return View(DefaultModel); 
    } 

    <authentication mode="Forms"> 
     <forms loginUrl="~/account/logon"/> 
    </authentication> 

這裏有一個similar, but different question

編輯:我只是試圖在http://example.com/accout/login?cat=dog手動輸入,它仍然重定向到一個無效的網址:account/logon%3Fcat=dog。我原本以爲這是與成員提供商和[RequireHttps]之間的衝突有關,但它看起來只是一個基本的錯誤,所以我認爲我必須自己修復源代碼。

回答

1

這似乎在ASP.NET MVC2 RC中已修復。

/admin 

現在被改寫爲正確的網址:

/account/logon?ReturnUrl=/admin 
1

假設這是在ASP.NET MVC 2預覽2這個臨時的錯誤是我所做的:

  • 創建RequireHttps2類
  • 應用[RequireHttps2]屬性,而不是[RequireHttps]

    公共類RequireHttps2Attribute:FilterAttribute,個IAuthorizationFilter {

    public virtual void OnAuthorization(AuthorizationContext filterContext) 
    { 
        if (filterContext == null) 
        { 
         throw new ArgumentNullException("filterContext"); 
        } 
    
        if (!filterContext.HttpContext.Request.IsSecureConnection) 
        { 
         HandleNonHttpsRequest(filterContext); 
        } 
    } 
    
    protected virtual void HandleNonHttpsRequest(AuthorizationContext filterContext) 
    { 
        // only redirect for GET requests, otherwise the browser might not propagate the verb and request 
        // body correctly. 
    
        if (!String.Equals(filterContext.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase)) 
        { 
         throw new InvalidOperationException("MUST USE SSL"); 
        } 
    
        // redirect to HTTPS version of page 
        UriBuilder builder = new UriBuilder() 
        { 
         Scheme = "https", 
         Host = filterContext.HttpContext.Request.Url.Host, 
         Path = filterContext.HttpContext.Request.Path, 
         Query = filterContext.HttpContext.Request.QueryString.ToString() 
    
         // ORIGINAL CODE : Path = filterContext.HttpContext.Request.RawUrl // use RawUrl since it works with URL rewriting 
    
        }; 
    
        string url = builder.ToString(); 
        filterContext.Result = new RedirectResult(url); 
    } 
    

    }

+0

我有完全相同的問題,但這是任何地方,我已經看到了解決它的唯一的帖子!謝謝。 – ChrisW 2009-12-22 20:21:31

+0

你嘗試過使用MVC 2 RC嗎?如果不是,我們需要提交錯誤報告! – 2009-12-23 00:24:49