Así que he encontrado el atributo [RequiresHttps] pero una vez que está en https su tipo de pegado allí, para intentar y poder tener acciones en una sola url (y esquema) He descubierto que he tenido que crear mi propio ExtendedController para volver a http para las acciones que no usan [RequireHttps].Moverse entre HTTP y HTTPS en ASP.NET MVC
¿Me pregunto si lo que estoy haciendo está bien o si hay una manera mejor?
public class ExtendedController : Controller
{
protected virtual void HandleHttpRequest(AuthorizationContext filterContext)
{
if (!string.Equals(filterContext.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
{
throw new InvalidOperationException("Cannot post between https and http.");
}
string url = "http://" + filterContext.HttpContext.Request.Url.Host + filterContext.HttpContext.Request.RawUrl;
filterContext.Result = new RedirectResult(url);
}
protected override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
object[] attributes = filterContext.ActionDescriptor.GetCustomAttributes(true);
if (!attributes.Any(a => a is RequireHttpsAttribute))
{
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
if (filterContext.HttpContext.Request.IsSecureConnection)
{
this.HandleHttpRequest(filterContext);
}
}
}
}
Una cosa que acabo de darme cuenta es que también debería verificar en filterContext.IsChildAction - Me pregunto si existe la posibilidad de encontrar los mismos problemas al usar RequiresHttp en las acciones secundarias. Parece que se necesita una solución más completa tal vez en el lado de enrutamiento en lugar de en los controladores. – Mark