Не удается в 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); }
}