0

尝试在 ASP.NET MVC 2 Preview 2 中将 [RequireHttps] 应用于 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>

这是一个 类似但不同的问题

编辑:我刚刚尝试手动输入http://example.com/accout/login?cat=dog,但它仍然重定向到无效的 URL : account/logon%3Fcat=dog。我最初认为这与会员提供者之间的冲突有关,[RequireHttps]但它看起来只是一个基本错误,所以我认为我必须自己修复源。

4

2 回答 2

1

假设这是 ASP.NET MVC 2 Preview 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);
    }
    

    }

于 2009-11-06T06:21:54.813 回答
1

这在 ASP.NET MVC2 RC 中似乎已修复。

 /admin 

现在被重写为正确的 URL:

 /account/logon?ReturnUrl=/admin
于 2009-12-23T22:30:38.293 回答