Не удается в MVC Preview 2 при применении к AccountController.LogOn

При попытке применить [RequireHttps] к AccountController.Logon в ASP.NET MVC 2 Preview 2 я получаю следующую ошибку:

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] но, похоже, это просто основная ошибка, поэтому я думаю, что мне придется просто исправить исходный код самостоятельно.

2 ответа

Решение

Это исправлено в ASP.NET MVC2 RC.

 /admin 

теперь переписывается на правильный URL:

 /account/logon?ReturnUrl=/admin

Предполагая, что это временная ошибка в 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);
    }
    

    }

Другие вопросы по тегам