2009-11-06 113 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