Adicionando uma página de cadastro de usuários (Hotspot) em ASP.NET no Mikrotik

Cada projeto que pego, é uma aventura nova a ser encarada! Dessa vez me adentrei no universo de Linux, rede, SSH, infra e tudo o que é direito. Quem não conhece, a Mikrotik é uma empresa de grande referência no que tange em equipamentos para redes de computadores. Seu principal destaque é o RouterOS que é sistema operacional que torna o roteador um poderoso gerente de rede. Dentro do Mikrotik (irei me referenciar sempre dessa forma generalizando como um produto), há o HotSpot. Com ele pode-se gerenciar quem irá autenticar na rede para usar a internet (ou apenas a intranet), banda usada, taxa de transferência e outras funcionalidades por usuário ou de forma geral. Um exemplo de uso desse sistema é de quando você vai a uma rede corporativa onde precisa autenticar-se para usar a internet... é isso!


Qual é o objetivo desse artigo então? A princípio é apenas obter as páginas originais de hotspot do Mikrotik, colocar um redirecionador para uma página externa, criar uma página externa de cadastro de usuário (para que possa acessar a rede) e fazer funcionar. Não ensinarei como configurar ou criar o hotspot. Pela net há vários tutoriais muito bons sobre o assunto e também não é de minha área. Recomendo fortemente o fórum da Under-Linux que lá o pessoal manja muito no assunto.

Nesse artigo usei o Mikrotik MKBR100 que é bem fácil de usar: basta plugar o cabo de rede da internet, do servidor e da energia. Pronto!

Para acessar seu SO, deve-se utilizar o Winbox como se fosse um daqueles players de máquina virtual ou OpenSSH. Vamos lá colocar a mão na massa!

Conecte o cabo de rede de seu PC (ou servidor) na porta (interface) ether2 do Mikrotik. Agora conecte outro cabo na ether1 para os outros computadores da rede (ou roteador simples). Porquê na ether1? Estou considerando que o hotspot está configurado para monitorar essa interface enquanto a ether2 será utilizado para que o servidor de comunique com o aparelho. Seria algo do tipo:



Vá em IP > Address no Mikrotik para que sejam configuradas as interfaces e sejam endereçados conforme os exemplos abaixo:

  • ether1: 192.168.88.1
  • ether2: 192.168.88.2

Somente através de IP que será possível enviar os arquivos do hotspot. Se ficar conectando, via MAC, pelo Winbox, você terá a mensagem de erro: "router has been disconnected" (logo, conecte-se usando a ether2 - 192.168.88.2). E outra coisa é: se não seguir o esquema acima, outros erros você terá, como:

could not connect to ... no response
could not connect to ... connection refused

could not connect to ... network is unreachable
could not fetch index from ... not found


Tudo isso por causa de configuração apenas! É bom deixar o IP do servidor fixo para que possa dar permissão de porta, firewall, etc. No caso deixei como 192.168.88.30 (que no caso era minha própria máquina). Uma dica: às vezes dê um reboot no aparelho!

O próximo passo é ativar a porta da API que o Mikrotik dispõe para integração com linguagens de programação. É através dela que iremos conectar e fazer a comunicação. Só que precisamos ativá-la. Vá em IP > Services e ative a API na porta 8728.


Também libere, no Firewall, as portas para conexão tanto do sistema quanto do Winbox (pelo IP), senão quando estiver acessando pela página de cadastro, irá surgir o erro: "nenhuma conexão pôde ser feita porque a máquina de destino as recusou ativamente ..:8728.".


Para permitir a navegação e envio de informações, adicione as permissões no Walled Garden.


Vejam que até o momento tudo é configuração e nada de programação. Continuemos...

Agora vamos em Files e selecione todos os arquivos da pasta hotspot, arraste para sua área de trabalho que será copiado. Para enviar faça o processo inverso... Se estiver acessando pelo IP vai dar certo, senão cairá a conexão (lembra que disse acima?).

Abra o HTML da página login.html e acione um link para a página de cadastro que ficará hospedada no servidor. Adicionei o link <a href="http://192.168.88.30/mikrotik/cadastro.aspx">cadastre-se</a> . Customize as demais páginas como desejar e as envie de volta. Praticamente terminamos de trabalhar no Mikrotik.

Agora vem o mais simples: criar a página ASP.NET. Você pode utilizar qualquer linguagem de programação que possa usar TCP na comunicação e que a API suporte: PHP, Delphi, C, C++, C#, Flash, Ruby on Rails, Java, Python, VB.NET, etc.

Faça o download da classe MK, em C# (eles já dispõe de classes prontas para outras linguagens também), nesse link aqui e adicione no seu projeto. Agora crie um Web Form adicionando os campos que queira trabalhar. No meu exemplo, só quis login (username) e senha. Adicione um Button e um método para executar o cadastro do usuário conforme exemplo abaixo:


             // Autenticação
            MK mikrotik = new MK("192.168.88.2");
            if (!mikrotik.Login("admin", ""))
            {
                ScriptManager.RegisterStartupScript(Page, typeof(Page), "alert", "alert('Houve um problema de comunicação com o Hotspot! Por favor, tente mais tarde.');", true);
                mikrotik.Close();
                return;
            }

            // Requisição
            mikrotik.Send("/ip/hotspot/user/add");
            mikrotik.Send("=name=" + nome.Text);
            mikrotik.Send("=password=" + senha.Text, true);

            //Retorno
            string retorno = string.Empty;
            foreach (string h in mikrotik.Read())
            {
                if (retorno != string.Empty)
                    retorno += ", ";
                retorno += h;
            }

            // Fecha objeto
            mikrotik.Close();

            // Validação
            if (retorno.ToLower().Contains("!done=ret="))
                ScriptManager.RegisterStartupScript(Page, typeof(Page), "alert", "alert('Cadastro realizado com sucesso!'); location.href='http://192.168.88.1/login.html';", true);
            else if (retorno.ToLower().Contains("message=failure: already have user with this name for this server"))
                ScriptManager.RegisterStartupScript(Page, typeof(Page), "alert", "alert('Já existe um usuário com esse nome!');", true);
            else
                ScriptManager.RegisterStartupScript(Page, typeof(Page), "alert", "alert('Falha no cadastro: " + retorno + "!');", true);


Você poderia não só fazer o cadastro de usuário no hotspot como também executar qualquer comando (SSH) no Mikrotik. Lembrando que eu atropelei muita coisa aí no que diz respeito a configuração do dispositivo na qual disse logo no início que não era minha finalidade. Vocês observaram que a parte de programação é bem simples do que configuração... e com certeza é! Agora nunca irá sair de minha cabeça a palavra Mikrotik Mikrotik Mikrotik Mikrotik Mikrotik ... Por favor, qualquer erro ou informação adicional me avise!

[]'s

UPDATE: disponibilizei uma implementação no post http://thiagomarcal.blogspot.com.br/2016/09/implementacao-do-aspnet-c-com-o.html

38 comentários:

Paschoal disse...

ola amigo ... gostei do seu artigo ... mais eu to querendo colocar na minha pagina do hostport em botao de cadastro ... e que esse cadastro quando efetuado... mostre o valor em hora e nao em velocidade ... e que o pagamento seja feito pelo mercado pago ... e que eu seja avisado no meu Imail ... sera que tem como ... forte abraço ... wbp_wbp@hotmail.com

Thiago Marçal disse...

Paschoal, tem como sim. Há duas formas de fazer isso: da mesma forma como fiz acima só que você terá que mudar a página de cadastro do usuário adicionando o envio de e-mail e o cálculo da cobrança. A outra forma é tentar embutir no próprio Mikrotik o formulário de cadastro essas condições o que, ao meu ver, é mais trabalhoso. Veja no link http://www.google.com.br/#sclient=psy-ab&hl=pt-BR&biw=1473&bih=797&source=hp&q=mikrotik+formul%C3%A1rio+google&pbx=1&oq=mikrotik+formul%C3%A1rio+google&aq=f&aqi=q-w1&aql=1&gs_sm=e&gs_upl=267l7179l0l7468l24l18l0l3l3l0l1336l10150l4-1.5.5.2l16l0&bav=on.2,or.r_gc.r_pw.,cf.osb&fp=9a6d4b235a01f0fb
Preferi separar o formulário de cadastro em outro servidor para ficar mais fácil a manutenção e utilizar a linguagem de programação que quiser. Dentro do Mikrotik a programação é limitada.

Christian disse...

ola ate a parte de inseri o link foi numa boa, mais sou muito fraco em criação de paginas, e asp net fica fora dos meus conhecimentos, tentei usando o front page criar a pagina mais dai em diante nada andou, vc poderia ajudar postando ou enviando para email um passo a passo para pessoas como eu que nada sabe de programação. cwsm@live.com

Thiago Marçal disse...

Christian, o passo-a-passo que fiz foi exatamente esse. Nada de diferente... O que mostrei foi muito de configuração do Mikrotik. A programação em ASP também resume-se nisso aí. Não tem muito o que ajudar nesse aspecto, mas qual seria o seu objetivo? Seria também fazer o cadastro? Posso depois lhe enviar as páginas produzidas e programadas das quais fiz o teste. Pode ser?

Hayttle Soljnivisk disse...

Oi Thiago, é uma solução dessa que estou procurando. Já vi em outro hotspot em que o cliente se conecta na rede, já navega na página do hotspot e lá tem as opções de planos para se cadastrar, ele escolhe o plano de acesso e quando clica em comprar, é direcionado para outra página com formulário para preencher os seus dados para pagamento, seja por cartão de crédito ou pagseguro. Como seria possível fazer essa implementação em uma página de hotspot?

Grande abraço.
Hayttle

Thiago Marçal disse...

Hayttle, a essência é quase a mesma. O que muda é a página de cadastro que terá que alterá-la para funcionar dessa forma. Lembrando que essa página de cadastro deve ficar em outro servidor, pois a programação dentro do hotspot não é permitida de acordo com esse contexto. Se você souber um pouco de programação dá para fazer essa página tranquilamente. Então você publica esse formulário em alguma servidor de aplicação e faz as devidas configurações no hotspot para ir a essa página.

Maranhao disse...

Boa dia Thiago.
Gostei muito do seu tutorial. Mas mesmo que ele esteja mastigadinho eu to apanhando pakas.. Não tenho conhecimento em ASP. Teria como me enviar esta página pronta e programada, se nao for um abuso meu te pedir isso!? Segue e-mail, se possível: maranhao_net@hotmail.com

diego software disse...

eu fechei um contrato com uma escola pra colocar paginas de login,para os alunos naum mecherem na internet porque eles usam a opção de mostrar senha da internet no windows 7, mais como eu naum entendo muito disso vou direto ao ponto,
eu moro a uns 700 km da escola e ja sei instalar o servidos mikrotik em um pc com duas placas de redes e distribuir a internet pra naum haver fraude eu queria criar uma pagina apenas para um usuario em especifico pra adcionar e exclui usuarios do sistema, e colocar tambem na pagina de login a opção do proprio usuario alterar a sua senha, com dados do tipo de pergunta secreta e tal, seria possivel isso

Thiago Marçal disse...

Diego, é possível sim. Todos os dados que são armazenados no Hotspot podem ser manipulados via API. Quanto à pergunta secreta não sei se será possível porque acho que esse dado não pode ser armazenado no cadastro a não ser que utilize um banco de dados à parte para realizar isso.

nick-rj disse...

Me da uma ajuda aí eu nao tenho um sistema pronto que cadastra pppoe no mysql e tudo mais, só nao consigo essa integracao direta com mk porque nao sei uma usar esse api, me da um help ai. Quando crio um aplicacao agente joga na pasta bim alguma possivel dll tipo a do mysql porexemplo e essa api? Programa com c#. Meu e-mail maicon.tab10@gmail.com

Thiago Marçal disse...

nick-rj você pode fazer isso tanto com ASP.NET quanto PHP, por exemplo. Na verdade, no próprio site da Mikrotik já dispõe algumas classe prontas para uso: http://wiki.mikrotik.com/wiki/Manual:API . Não precisa de DLL, apenas a classe dentro de sua aplicação.

Anônimo disse...

thiago boa noite cara ...eu personalizei meu hotspot está funcionando 100% estava pesquisando e achei muito interessante esse trabalho....vc poderia tbm me enviar esse material para eu poder imcrementar meu site?páginas produzidas e programadas das quais vocÊ fez e comentou com o cristhian e o maranhão sobre cadastro e também configurar para liberação pós pagamento via cartão ou boleto...abç

Anônimo disse...

Tem como ser em ASP no lucar de ASP.NET?
luisecia@hotmail.com

Thiago Marçal disse...

Possível é, contudo é mais trabalhoso uma vez que na própria wiki eles não dispõe o código pronto: http://wiki.mikrotik.com/wiki/Manual:API#API_examples_in_the_Wiki . Para fazer em ASP clássico você poderia converter o código PHP ou usar o modelo em VB ou fazer uma chamada à uma biblioteca compilada em C#. Infelizmente não tenho o código convertido :(

Anônimo disse...

Ólá Thiago,

Seu artigo ficou muito bom, e dessa forma (com um servidor separado para cadastro) abre-se um leque de possibilidades. Gostaria de fazer uma pergunta:

Eu consigo fazer o código para autenticação em bash?

Desde ja agradeço!

Anônimo disse...

Ola Tiago, primeiramente gostaria de parabeniza-lo pelo post é um excelente material e de grande valia.

Eu estou com um caso na mãos e não seu como seguir pois prestamos serviços sociais aqui na nossa cidade e estamos para implementar um hotspot gratuito em alguns pontos.

Vamos utilizar apenas uma Routerboard RB433Ah como roteador e autenticação do hotspot, tenho o layout pronto da tela de login e o que preciso é que na tela de login o usuário tenha um botão cadastrar, onde ele fará um cadastro simples, com usuario, senha, nome completo, Rg e telefone.

Após cadastrado o sistema já libera ele automaticamente pra fazer o seu login que acabou de fazer.

Vc tem algum modelo nesse esquema que pode me passar por email

Se for o caso eu compro de vc claro que se não for muito caro, já que uma vez estamos fazendo isso de graça também..

Meu contato: antenas.megalink@gmail.com A/C André

Obrigado e fique com Deus

Daniel Mello disse...

Thiago, Beleza... Seu tutorial é extremamente jóia! valeu! Preciso só tirar uma dúvida, mas após o cliente efetuar o registro já sai navegando? como faço para que o cliente primeiro faça o cadastro e depois que pagar possa navegar?!

Thiago Marçal disse...

Daniel, só fiz a parte mesmo do cadastro. A autenticação não fiz, pois depois do cadastro volto para a tela de autenticação do próprio hotspot (já que ele tem tudo já pronto para fazer o login).
Para fazer o login automático após o cadastro, teria que dar uma olhada na documentação para ver se há algum comando que já envie para o Mikrotik que o usuário já está logado no sistema (o que acho que deve ter). E quanto ao pagamento, você pode fazer de várias formas. O que sugiro é que redirecione o cliente a uma tela de pagamento, a princípio, e que, após efetuado, volte ao cadastro dele. Aí será um bocadinho de código a ser feito :)

Cleber disse...

Excelente tutorial, pesquisei demais até encontrar esse que me foi muito esclarecedor.
Se puder me tirar umas duvidas ficarei agradecido.
- Dá pra deixar a pagina de cadastro dentro do hotspot ao invés de usar um servidor externo?
- Tem como definir que o login precisa ser criado com nome, e-mail válido, cpf, endereço, telefone, data nascimento? Não precisa confirmar o e-mail, somente evitar que coloquem coisas absurdas como palavrão.
- Tem como receber os e-mails cadastrados em um e-mail particular da empresa? Usaremos estes e-mails para futuras divulgações sem caracterizar spam.
- Na segunda vez que o usuário acessar o hotspot, ele já utilizar o login existente, sem necessitar de novo cadastro e ter opção de recuperar senha.
Se puder me ajudar, mesmo que cobre pra isso! cleber@megalinkti.com.br

Thiago Marçal disse...

Cleber, dentro do Mikrotik creio que não é possível devido ao seu framework próprio. Comentei com alguns amigos e a solução encontrada é a utilização dessa integração que ele permite, apenas. Para criação do login, os campos a serem preenchidos devem ser os mesmos que que o hospot coleta (não pode ter um campo que ele não permite, a menos que adicione em observação ou que seja enviada por e-mail).
A cada cadastro é possível enviar um e-mail com informações do cadastro, sem problemas, a menos, como disse anteriormente, que a aplicação esteja em um servidor cuja linguagem de programação suportada realize tal função.
Só não sei te confirmar a opção de recuperação de senha. Se o hotspot permitir tal comando via linha de comando, basta implementar a chamada. Veja se as respostas ajuda e qualquer coisa é só entrar em contato. Abs

scriptsbook.blogspot.com disse...

teriqa como enviar pagina de cadastro amytibia@hotmail.com

Anônimo disse...

Thiago Marçal, você tem alguma páginas ja produzida e programada para cadastro se tiver você pode me passar.
luanrafael@outloo.com

Unknown disse...

Excelente descrição!

Estarei colocando-a em funcionamento hoje em meu mikrotik...

Parabéns!

Unknown disse...

Thiago, já fiz todos os procedimentos já consigo acessar o MK, tbm fiz um formulário para preenchimentos dos dados dos clientes e jogar para o MK e funfou certinho. Depois fui preparar a página do hotspot, coloquei o link para cadastro conforme havia falado, mas toda vez que clico no link de cadastro ele tenta carregar o formulário, mas me redireciona novamente para a página de login do MK.
Só consigo acessar essa página de cadastro depois que faço login. Os endereços de IP para redirecionar a página estão corretos.
VC teria alguma ideia do que pode estar acontencendo???

Unknown disse...

Muito bom, vou trabalhar aqui para interpretar isso.

asdf disse...

Thiago, pode me dar um help!

Seguinte, estou desenvolvendo uma aplicação em asp.net para autenticar usuários, porém acredito que precise enviar alguma informação para o mikrotik para liberar esse acesso para navegar, você sabe o que devo fazer para liberar esse acesso?
Obrigado,

Unknown disse...

Muito bom seu tutoria.

Gostaria de saber como posso fazer se o servidor for externo

Unknown disse...

seria otimo se fizesse um video repetindo este processo para auxiliar aos leigos no assunto :)

Anderson disse...

Por aí e difícil achar um conteúdo desse tão rico em informacoes. A maioria q já vi por ai a resposta é sempre a mesma (mkauth já faz tudo isso é blablabla), as pessoas devem entender que todos fixado por tecnologia quer botar a mão na massa e fazer acontecer para o conhecimento e não usar sistemas prontos mastigado como (MKauth). Parabéns Thiago continue assim propagando conhecumento. um abraço.

Thiago Marçal disse...

Em breve irei fazer outro artigo e disponibilizarei o código fonte. Há vários e-mails pedindo exemplos de integração.

Unknown disse...

Thiago boa tarde, estou com duvidas na hora de integrar a API, e só copiar o codigo do site da MK criar uma classe no asp.net e colar o codigo?

att,

Thiago Marçal disse...

Allan, você precisa criar uma página (ou uma aplicação) em ASP.NET com utilizando a classe MK. O método utiliza essa classe para realizar as ações.

Unknown disse...

Thiago boa noite, então eu criei uma aplicação em mvc porem não consegui integrar essa classe. Para ser sincero nao faço ideia de como efetuar esta integração e embora tenha pesquisado bastante obtive muito pouco material sobre integração com o MK.

Unknown disse...

Poderia enviar por favor o Cod fonte para Wellerson23@hotmail.com

Thiago Marçal disse...

Allan, disponibilizei uma aplicação teste de como é realizado.

Anônimo disse...

Olá achei este post muito bom,deu para intender quase tudo somente quando chego na parte da programação asp que buguei,ainda sou nub nessa area, gostaria de ver com vc se tem como vc criar uma pagina de cadastro somete com o campo de user e pass e o botão para enviar em php, o resto eu ja consigo fazer, vc pode esta entrando em contato pelo o danielvcr_pessoal@outlook.com se precisa passo meu whats por lá. Des de já obrigado!

Thiago Marçal disse...

Daniel, dê uma olhada no código que disponibilizei aqui http://thiagomarcal.blogspot.com.br/2016/09/implementacao-do-aspnet-c-com-o.html.
Quanto em PHP posso tentar disponibilizar uma versão depois.

Unknown disse...

alguem me ajuda a implementar a classe php no mikrotik

Postar um comentário