Quiero usar RequireHttpsAttribute para evitar que se envíen solicitudes HTTP no seguras a un método de acción.
C#
[RequireHttps] //apply to all actions in controller
public class SomeController
{
[RequireHttps] //apply to this action only
public ActionResult SomeAction()
{
...
}
}
VB
<RequireHttps()> _
Public Class SomeController
<RequireHttps()> _
Public Function SomeAction() As ActionResult
...
End Function
End Class
Desafortunadamente, ASP.NET Development Server no es compatible con HTTPS.
¿Cómo puedo hacer que mi aplicación ASP.NET MVC use RequireHttps cuando se publique en el entorno de producción, pero no cuando se ejecute en mi estación de trabajo de desarrollo en el servidor de desarrollo ASP.NET?
asp.net-mvc
visual-studio
ssl
https
Zack Peterson
fuente
fuente
Respuestas:
Esto no ayudará si ejecuta versiones de lanzamiento en su estación de trabajo de desarrollo, pero la compilación condicional podría hacer el trabajo ...
Actualizar
En Visual Basic, los atributos son técnicamente parte de la misma línea que la definición a la que se aplican. No puede poner declaraciones de compilación condicional dentro de una línea, por lo que se ve obligado a escribir la declaración de función dos veces, una con el atributo y otra sin ella. Sin embargo, funciona si no te importa la fealdad.
Actualización 2
Varias personas han mencionado derivar
RequireHttpsAttribute
sin proporcionar un ejemplo, así que aquí hay uno para usted. Creo que este enfoque sería mucho más limpio que el enfoque de compilación condicional, y sería mi preferencia en su posición.DESCARGO DE RESPONSABILIDAD: No he probado este código, ni siquiera un poco, y mi VB está bastante oxidado. Todo lo que sé es que se compila. Lo escribí en base a las sugerencias de spot, queen3 y Lance Fisher. Si no funciona, al menos debería transmitir la idea general y darle un punto de partida.
Básicamente, el nuevo atributo simplemente se cierra en lugar de ejecutar el código de autorización SSL predeterminado, si la solicitud actual es local (es decir, está accediendo al sitio a través de localhost). Puedes usarlo así:
Mucho más limpio! Siempre que mi código no probado realmente funcione.
fuente
Si alguien necesita la versión C #:
fuente
filters.Add(new MyRequireHttpsAttribute ());
enFilterConfig
?Derivar de RequireHttps es un buen enfoque.
Para evitar el problema por completo, también puede usar IIS en su máquina local con un certificado autofirmado. IIS es más rápido que el servidor web incorporado, y tiene la ventaja de que su entorno de desarrollo se parece más a la producción.
Scott Hanselman tiene un gran recurso sobre algunas formas de implementar HTTPS local con VS2010 e IIS Express.
fuente
Aprovechando el sistema de filtro MVC y Global.asax.cs, supongo que podría hacer esto ...
fuente
Como fue el servidor de desarrollo ASP.Net el que causó su problema en primer lugar, vale la pena señalar que Microsoft ahora tiene IIS Express , que se incluye con Visual Studio (desde VS2010 SP1). Esta es una versión reducida de IIS que es tan fácil de usar como el Servidor de desarrollo, pero admite el conjunto completo de características de IIS 7.5, incluido SSL.
Scott Hanselman tiene una publicación detallada sobre el trabajo con SSL en IIS Express .
fuente
¿Qué tal heredar el atributo RequireHttps en un atributo personalizado? Luego, dentro de su atributo personalizado, verifique la propiedad IsLocal de la solicitud actual para ver si la solicitud proviene de la máquina local. Si es así, no aplique la funcionalidad base. De lo contrario, llame a la operación base.
fuente
Esto funcionó para mí, MVC 6 (ASP.NET Core 1.0) . El código verifica si la depuración está en desarrollo, y si no, no se requiere SSL. Todas las ediciones están en Startup.cs .
Añadir:
Añadir:
Editar:
fuente
Si puede derivar y anular, hágalo. Si no puede: MVC viene con fuentes, simplemente tome las fuentes y cree su propio atributo [ForceHttps] que verifique IsLocal.
fuente
Para MVC 3 agregué mi propio FilterProvider (basado en el código que se encuentra aquí: Filtros globales y condicionales que, entre otras cosas (mostrar información de depuración para usuarios locales, etc.) decorarán todas las acciones con
RequireHttpsAttribute
cuándoHttpContext.Request.IsLocal == false
.fuente
Después de investigar en voz alta, pude resolver este problema con IIS Express y anular el método OnAuthorization de la clase Controller (Ref. # 1). También he seguido la ruta recomendada por Hanselman (Ref. 2). Sin embargo, no estaba completamente satisfecho con estas dos soluciones debido a dos razones: 1. La OnAuthorization de Ref # 1 solo funciona en el nivel de acción, no en el nivel de clase de controlador 2. La Ref # 2 requiere mucha configuración (Win7 SDK para makecert ), comandos de netsh y, para poder usar el puerto 80 y el puerto 443, necesito iniciar VS2010 como administrador, lo que desapruebo.
Entonces, se me ocurrió esta solución que se centra en la simplicidad con las siguientes condiciones:
Quiero poder utilizar el RequireHttps attbbute en la clase Controlador o en el nivel de acción
Quiero que MVC use HTTPS cuando el atributo RequireHttps esté presente, y use HTTP si está ausente
No quiero tener que ejecutar Visual Studio como administrador
Quiero poder usar cualquier puerto HTTP y HTTPS asignado por IIS Express (Ver Nota # 1)
Puedo reutilizar el certificado SSL autofirmado de IIS Express, y no me importa si veo el mensaje SSL no válido
Quiero que el desarrollo, la prueba y la producción tengan exactamente la misma base de código y el mismo binario y sean tan independientes de la configuración adicional (por ejemplo, usando netsh, complemento de cert mmc, etc.) como sea posible
Ahora, con los antecedentes y la explicación fuera del camino, espero que este código ayude a alguien y ahorre algo de tiempo. Básicamente, cree una clase BaseController que herede de Controller y obtenga sus clases de controlador de esta clase base. Como has leído hasta aquí, supongo que sabes cómo hacer esto. Entonces, ¡feliz codificación!
Nota # 1: Esto se logra mediante el uso de una función útil 'getConfig' (ver código)
Ref # 1: http://puredotnetcoder.blogspot.com/2011/09/requirehttps-attribute-in-mvc3.html
Ref # 2: http://www.hanselman.com/blog/WorkingWithSSLAtDevelopmentTimeIsEasierWithIISExpress.aspx
========== Código en BaseController ===================
============== código final ================
En Web.Release.Config, agregue lo siguiente para borrar HttpPort y HttpsPort (para usar los valores predeterminados 80 y 443).
fuente
Una solución que puede utilizar tanto en la producción como en la estación de trabajo de desarrollo. Se basa en su opción de la configuración de la aplicación en web.config
Si no desea utilizar SSL, elimine la clave. Si utiliza el puerto SSL estándar 443, elimine el valor o especifique 443.
Luego use la implementación personalizada de RequireHttpsAttribute que se ocupa de su condición. En realidad, se deriva de RequireHttps y utiliza la misma implementación del método base, excepto para agregar condiciones.
No se olvide de decorar LogOn método en el AccountController
y algo así en su Vista de inicio de sesión para publicar el formulario a través de https.
fuente
Como mencionó Joel, puede modificar la compilación utilizando la
#if !DEBUG
directiva.Me acabo de enterar de que puede alterar el valor del símbolo DEBUG en el elemento de compilación del archivo web.config. Espero que ayude.
fuente
MVC 6 (ASP.NET Core 1.0):
La solución adecuada sería usar env.IsProduction () o env.IsDevelopment (). Lea más sobre la razón detrás en esta respuesta sobre cómo requerir https solo en producción .
Respuesta resumida a continuación (vea el enlace de arriba para leer más sobre las decisiones de diseño) para 2 estilos diferentes:
Startup.cs (filtro de registro):
BaseController.cs (estilo de atributo):
RequireHttpsInProductionAttribute : los dos anteriores están utilizando atributos personalizados heredados de RequireHttpsAttribute :
fuente
Esta fue la forma más limpia para mí. En mi
App_Start\FilterConfig.cs
archivo Sin embargo, ya no puedo ejecutar versiones de lanzamiento.Alternativamente, puede configurarlo para que solo requiera https cuando su página de error personalizada esté activada.
fuente
Consulte esta publicación de Rick Anderson en RickAndMSFT en Azure y MVC llenando la brecha de Azure
http://blogs.msdn.com/b/rickandy/archive/2011/04/22/better-faster-easier-ssl-testing-for-asp-net-mvc-amp-webforms.aspx
fuente