Quero usar o RequireHttpsAttribute para impedir que solicitações HTTP não seguras sejam enviadas para um método de ação.
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
Infelizmente, o ASP.NET Development Server não oferece suporte a HTTPS.
Como posso fazer meu aplicativo ASP.NET MVC usar RequireHttps quando publicado no ambiente de produção, mas não quando executado na minha estação de trabalho de desenvolvimento no ASP.NET Development Server?
asp.net-mvc
visual-studio
ssl
https
Zack Peterson
fonte
fonte
Respostas:
Isso não ajudará se você executar versões da versão em sua estação de trabalho de desenvolvimento, mas a compilação condicional poderá fazer o trabalho ...
Atualizar
No Visual Basic, os atributos são tecnicamente parte da mesma linha que a definição a que se aplicam. Você não pode colocar instruções de compilação condicional dentro de uma linha; portanto, você é forçado a escrever a declaração da função duas vezes - uma com o atributo e outra sem. Funciona, no entanto, se você não se importa com a feiura.
Atualização 2
Várias pessoas mencionaram derivar
RequireHttpsAttribute
sem fornecer um exemplo, então aqui está um para você. Penso que esta abordagem seria muito mais limpa do que a abordagem de compilação condicional e seria a minha preferência na sua posição.AVISO LEGAL: Eu não testei esse código, nem um pouco, e meu VB está bastante enferrujado. Tudo o que sei é que ele compila. Eu o escrevi com base nas sugestões de spot, queen3 e Lance Fisher. Se não funcionar, deve pelo menos transmitir a ideia geral e fornecer o ponto de partida.
Basicamente, o novo atributo é encerrado em vez de executar o código de autorização SSL padrão, se a solicitação atual for local (ou seja, você está acessando o site por meio do host local). Você pode usá-lo assim:
Muito mais limpo! Desde que meu código não testado realmente funcione.
fonte
Se alguém precisar da versão C #:
fonte
filters.Add(new MyRequireHttpsAttribute ());
emFilterConfig
?Derivar de RequireHttps é uma boa abordagem.
Para solucionar o problema completamente, você também pode usar o IIS em sua máquina local com um certificado autoassinado. O IIS é mais rápido que o servidor da web interno e você tem a vantagem de que seu ambiente de desenvolvimento é mais parecido com a produção.
Scott Hanselman tem um ótimo recurso em algumas maneiras de implementar o HTTPS local com o VS2010 e o IIS Express.
fonte
Aproveitando o sistema de filtro MVC e o Global.asax.cs, suponho que você possa fazer isso ...
fonte
Como foi o ASP.Net Development Server que causou o seu problema, em primeiro lugar, é importante notar que a Microsoft agora possui o IIS Express , que é fornecido com o Visual Studio (desde o VS2010 SP1). Esta é uma versão reduzida do IIS que é tão fácil de usar quanto o Servidor de Desenvolvimento, mas suporta o conjunto completo de recursos do IIS 7.5, incluindo SSL.
Scott Hanselman tem uma postagem detalhada sobre como trabalhar com SSL no IIS Express .
fonte
Que tal herdar o atributo RequireHttps em um atributo personalizado. Em seguida, dentro do seu atributo customizado, verifique a propriedade IsLocal da solicitação atual para ver se a solicitação é proveniente da máquina local. Se for, não aplique a funcionalidade básica. Caso contrário, chame a operação base.
fonte
Isso funcionou para mim, MVC 6 (ASP.NET Core 1.0) . O código verifica se a depuração está em desenvolvimento e, se não, o ssl não é necessário. Todas as edições estão em Startup.cs .
Adicionar:
Adicionar:
Editar:
fonte
Se você pode derivar e substituir - faça-o. Se você não puder - o MVC vem com fontes, basta pegar as fontes e criar seu próprio atributo [ForceHttps] que verifica IsLocal.
fonte
Para o MVC 3, adicionei meu próprio FilterProvider (com base no código encontrado aqui: Filtros Globais e Condicionais que, entre outras coisas (exibindo informações de Depuração para usuários locais etc.), decoram todas as ações com
RequireHttpsAttribute
quandoHttpContext.Request.IsLocal == false
.fonte
Após pesquisar em voz alta, consegui resolver esse problema com o IIS Express e uma substituição do método OnAuthorization da classe Controller (Ref # 1). Eu também segui a rota recomendada por Hanselman (Ref # 2). No entanto, eu não estava completamente satisfeito com essas duas soluções devido a dois motivos: 1. A OnAuthorization da referência nº 1 funciona apenas no nível da ação, não na classe da controladora 2. A referência nº 2 requer muita configuração (Win7 SDK for makecert ), comandos netsh e, para usar a porta 80 e a porta 443, preciso iniciar o VS2010 como administrador, com o qual desaprovo.
Então, eu vim com esta solução que se concentra na simplicidade com as seguintes condições:
Quero poder usar o attbbute RequireHttps na classe ou nível de ação do Controller
Quero que o MVC use HTTPS quando o atributo RequireHttps estiver presente e use HTTP se ele estiver ausente
Não quero ter que executar o Visual Studio como administrador
Quero poder usar as portas HTTP e HTTPS atribuídas pelo IIS Express (consulte a Nota 1)
Posso reutilizar o certificado SSL autoassinado do IIS Express e não me importo se vir o prompt SSL inválido
Desejo que o desenvolvedor, o teste e a produção tenham exatamente a mesma base de código e o mesmo binário, além de serem independentes de configurações adicionais (por exemplo, usando netsh, snap-in de certificação mmc etc.)
Agora, com o plano de fundo e a explicação fora do caminho, espero que esse código ajude alguém e economize algum tempo. Basicamente, crie uma classe BaseController que herda do Controller e obtenha suas classes de controlador dessa classe base. Desde que você leu até aqui, presumo que você saiba como fazer isso. Então, feliz codificação!
Nota # 1: Isso é alcançado pelo uso de uma função útil 'getConfig' (consulte o 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 no BaseController ===================
============== código final ================
No Web.Release.Config, adicione o seguinte para limpar o HttpPort e o HttpsPort (para usar o padrão 80 e 443).
fonte
Uma solução que você pode usar na produção e na estação de trabalho de desenvolvimento. É baseado em sua opção nas configurações do aplicativo em web.config
Se você não quiser usar SSL, remova a chave. Se você usar a porta SSL padrão 443, remova o valor ou especifique 443.
Em seguida, use a implementação customizada de RequireHttpsAttribute que cuida de sua condição. Na verdade, é derivado de RequireHttps e usa a mesma implementação do método base, exceto para adicionar condições.
Não se esqueça de decorar o método LogOn no AccountController
e algo assim na sua exibição de logon para postar o formulário em https.
fonte
Como Joel mencionou, você pode alterar a compilação usando a
#if !DEBUG
diretiva.Acabei de descobrir que você pode alterar o valor do símbolo DEBUG no elemento de compilação do arquivo web.config. Espero que ajude.
fonte
MVC 6 (ASP.NET Core 1.0):
A solução adequada seria usar env.IsProduction () ou env.IsDevelopment (). Leia mais sobre o motivo por trás desta resposta sobre como exigir https somente na produção .
Resposta condensada abaixo (veja o link acima para ler mais sobre decisões de design) para 2 estilos diferentes:
Startup.cs (filtro de registro):
BaseController.cs (estilo do atributo):
RequireHttpsInProductionAttribute : acima estão usando o atributo personalizado herdado de RequireHttpsAttribute :
fonte
Esta foi a maneira mais limpa para mim. No meu
App_Start\FilterConfig.cs
arquivo No entanto, não é possível executar versões de lançamento.Como alternativa, você pode configurá-lo para exigir apenas https quando sua página de erro personalizada estiver ativada.
fonte
Consulte esta postagem de Rick Anderson no RickAndMSFT no Azure e MVC Preenchendo a lacuna do Azure
http://blogs.msdn.com/b/rickandy/archive/2011/04/22/better-faster-easier-ssl-testing-for-asp-net-mvc-amp-webforms.aspx
fonte