0

[RequireHttps] を ASP.NET MVC 2 Preview 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 ではありません)、RequireHttpsURL をリダイレクトして混乱させているのは属性です。

%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 クラスを作成
  • [RequireHttps] の代わりに [RequireHttps2] 属性を適用

    public class 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 に答える