E-mail com link de Validação/Autenticação para usuário Cadastrado via MemberShipProvider
Olá Consultores DevMedia, gostaria de saber como se criar um envio de e-mail em ASP.NET AJAX ENABLED WEB APPLICATION PROJECT, WEB APPLICATION PROJECT ou ASP.NET WEB SITE em CSharp Asp.Net, personalizavel e com link de validação e mais outro link para uma página do tipo painel admin, que só este usuário cadastrado e validado para o usuário que ao se cadastrar em meu site via member ship provider, mas que sua autenticação para efetuar login e senha com mais segurança só seja feita após o mesmo ter clicado o link de validação em seu email, enfim como eu faria isso passo a passo como seria esse processo e como eu faria essa validação do usuario do member ship via link de email
Fico no aguardo caso alguem possa me ajudar e desde já agradeço
Fico no aguardo caso alguem possa me ajudar e desde já agradeço
Luiz Franco
Curtidas 0
Respostas
Fabio Mans
06/03/2009
Olá, tudo bem?
O envio do email você sabe fazer?
Para validar a conta você vai ter que enviar no link por querystring o usuário e em uma página utilizar o método abaixo.
using System; using System.Web.Security; public partial class Membership : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (Request.QueryString["usuario"] != null) { string usuario = Request.QueryString["usuario"].ToString(); MembershipUser usrInfo = System.Web.Security.Membership.GetUser(usuario); if (usrInfo != null) { usrInfo.UnlockUser(); } } } } Neste momento se ele acessou a página você deve liberar a conta. Por que você está utilizando Membership? Se fosse um banco seu seria mais fácil fazer. Fabio
O envio do email você sabe fazer?
Para validar a conta você vai ter que enviar no link por querystring o usuário e em uma página utilizar o método abaixo.
using System; using System.Web.Security; public partial class Membership : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (Request.QueryString["usuario"] != null) { string usuario = Request.QueryString["usuario"].ToString(); MembershipUser usrInfo = System.Web.Security.Membership.GetUser(usuario); if (usrInfo != null) { usrInfo.UnlockUser(); } } } } Neste momento se ele acessou a página você deve liberar a conta. Por que você está utilizando Membership? Se fosse um banco seu seria mais fácil fazer. Fabio
GOSTEI 0
Luiz Franco
06/03/2009
Olá Fabio Galante, prazer vejo muitos de seus artigos e vídeos mas ainda não sei como proceder no envio de email..mas a lógica do que eu preciso fazer seria exatamente o quadro abaixo
1)O Usuário se cadastra via MemberShipProvider mas ele não pode estar autenticado ou sua autenticação validada ainda;
2)Tem que sêr enviado um email com dois links para o cadastrado um link sendo para ele clicar no link e validar o usuário(de preferência na querystring este user estar cryptografado que nem o hotmail fáz) para após ele se logar em seu painel administrativo e o outro link sendo o link do painel administrativo no mesmo email que ele irá se logar posteriormente (o objetivo disto é que não quero esse link aparecendo na pagina e apenas no email do usuário), lembrando que este email tem que ser aceito tb se a pessoa se cadastrar usando email de hotmail, yahoo email para se evitar que esses mecanismos seja pego o SPAM como faria isso tb teria como me dar uma ajudinha
Fico no aguardo de algum exemplo ou vídeo se possivel que me exemplifique de como fz isso
GOSTEI 0
Fabio Mans
06/03/2009
Se o cadastro for feito Membership você deve utilizar MailDefinition para disparar uma mensagem após o cadastro
Primeiro você cria no Web.Config
<system.net>
<mailSettings>
<smtp from=support@mydomain.com>
<network host="mail.mydomain.com" port="25" userName="user@mydomain.com" password="mypassword" defaultCredentials="false" />
</smtp>
</mailSettings>
</system.net> Em seguida <asp:CreateUserWizard ID="CreateUserWizard1" Runat="server"> <MailDefinition BodyFileName="~/RegistrationEmail.txt" From="http://seussite.com" Subject="Thanks for registering!"> </MailDefinition> </asp:CreateUserWizard> No BodyFileName você pode montar como no exemplo abaixo. Thank you for registering web site! Follows your credentials for logging-in:
UserName: <% UserName %>
Password: <% Password %> See you online! Porém você deve mudar a lógica acima enviando um link para ele confirmar o registro. Uma flag no banco seria interessante. Espero ter ajudado.
<mailSettings>
<smtp from=support@mydomain.com>
<network host="mail.mydomain.com" port="25" userName="user@mydomain.com" password="mypassword" defaultCredentials="false" />
</smtp>
</mailSettings>
</system.net> Em seguida <asp:CreateUserWizard ID="CreateUserWizard1" Runat="server"> <MailDefinition BodyFileName="~/RegistrationEmail.txt" From="http://seussite.com" Subject="Thanks for registering!"> </MailDefinition> </asp:CreateUserWizard> No BodyFileName você pode montar como no exemplo abaixo. Thank you for registering web site! Follows your credentials for logging-in:
UserName: <% UserName %>
Password: <% Password %> See you online! Porém você deve mudar a lógica acima enviando um link para ele confirmar o registro. Uma flag no banco seria interessante. Espero ter ajudado.
GOSTEI 0
Luiz Franco
06/03/2009
Olá Fábio Galante boa tarde....
Bem vamos por partes em algo que não entendi ainda
Primeiro você cria no Web.Config
<system.net>
<mailSettings>
<smtp from=support@mydomain.com>
<network host="mail.mydomain.com" port="25" userName="user@mydomain.com" password="mypassword" defaultCredentials="false" />
</smtp>
</mailSettings>
</system.net> Duvida 1 - No web.config, No caso o que seria network host="mail.mydomain.com" e userName="user@mydomain.com" Em seguida <asp:CreateUserWizard ID="CreateUserWizard1" Runat="server"> <MailDefinition BodyFileName="~/RegistrationEmail.txt" From="http://seussite.com" Subject="Thanks for registering!"> </MailDefinition> </asp:CreateUserWizard> Duvida 2 - Como seria feito acima se estou usando no lugar do controle create user wizard um form comum personalizado com caixas de texto e code-behind por exemplo em csharp Dúvida 3 - No caso como eu incluiria o link de validação na logica abaixo e um link adicional para a pagina administrativa do usuário Thank you for registering web site! Follows your credentials for logging-in:
UserName: <% UserName %>
Password: <% Password %> See you online! Duvida 4 - E como seria você deve mudar a lógica acima enviando um link para ele confirmar o registro. Uma flag no banco seria interessante? Teria algum exemplo em video ou algo assim para me facilitar Estou usando o VS2008 Fico no aguardo e desde já agradeço
<mailSettings>
<smtp from=support@mydomain.com>
<network host="mail.mydomain.com" port="25" userName="user@mydomain.com" password="mypassword" defaultCredentials="false" />
</smtp>
</mailSettings>
</system.net> Duvida 1 - No web.config, No caso o que seria network host="mail.mydomain.com" e userName="user@mydomain.com" Em seguida <asp:CreateUserWizard ID="CreateUserWizard1" Runat="server"> <MailDefinition BodyFileName="~/RegistrationEmail.txt" From="http://seussite.com" Subject="Thanks for registering!"> </MailDefinition> </asp:CreateUserWizard> Duvida 2 - Como seria feito acima se estou usando no lugar do controle create user wizard um form comum personalizado com caixas de texto e code-behind por exemplo em csharp Dúvida 3 - No caso como eu incluiria o link de validação na logica abaixo e um link adicional para a pagina administrativa do usuário Thank you for registering web site! Follows your credentials for logging-in:
UserName: <% UserName %>
Password: <% Password %> See you online! Duvida 4 - E como seria você deve mudar a lógica acima enviando um link para ele confirmar o registro. Uma flag no banco seria interessante? Teria algum exemplo em video ou algo assim para me facilitar Estou usando o VS2008 Fico no aguardo e desde já agradeço
GOSTEI 0
Fabio Mans
06/03/2009
Duvida 1 - No web.config, No caso o que seria
network host é o smtp, o mesmo que você utiliza para enviar email no seu programa, userName é necessário caso o seu provedor solicite autenticação.
<system.net>
<mailSettings>
<smtp from=support@mydomain.com>
<network host="mail.mydomain.com" port="25" userName="user@mydomain.com" password="mypassword" defaultCredentials="false" />
</smtp>
</mailSettings>
</system.net> Duvida 1 - No web.config, No caso o que seria network host="mail.mydomain.com" e userName="user@mydomain.com" Duvida 2 - Como seria feito acima se estou usando no lugar do controle create user wizard um form comum personalizado com caixas de texto e code-behind por exemplo em csharp É mais fácil ainda, assim que ele criar a conta você cria um método de envio de email, não precisa utilizar o MailDefinition. Em seguida <asp:CreateUserWizard ID="CreateUserWizard1" Runat="server"> <MailDefinition BodyFileName="~/RegistrationEmail.txt" From="http://seussite.com" Subject="Thanks for registering!"> </MailDefinition> </asp:CreateUserWizard> Duvida 2 - Como seria feito acima se estou usando no lugar do controle create user wizard um form comum personalizado com caixas de texto e code-behind por exemplo em csharp Dúvida 3 - No caso como eu incluiria o link de validação na logica abaixo e um link adicional para a pagina administrativa do usuário Este link é normal com <a href="suapagina.aspx>Link<a> se precisar passar algum valor você deve concatenar Thank you for registering web site! Follows your credentials for logging-in:
UserName: <% UserName %>
Password: <% Password %> See you online! Duvida 4 - E como seria você deve mudar a lógica acima enviando um link para ele confirmar o registro. Uma flag no banco seria interessante? Teria algum exemplo em video ou algo assim para me facilitar Mudar a lógica é como eu expliquei na resposta 3, cria um método de envio de email e a Flag pode ser um campo char(1) se o campo for N significa que ele é novo usuário, acabou de se cadastrar, quando ele clicar no link e validar você faz um update para A isso que significa que agora ele é ativo, quando ele for fazer a autenticação se o campo não for igual a A você não deixa ele acessar. Espero ter ajudado com as idéias acima.
<mailSettings>
<smtp from=support@mydomain.com>
<network host="mail.mydomain.com" port="25" userName="user@mydomain.com" password="mypassword" defaultCredentials="false" />
</smtp>
</mailSettings>
</system.net> Duvida 1 - No web.config, No caso o que seria network host="mail.mydomain.com" e userName="user@mydomain.com" Duvida 2 - Como seria feito acima se estou usando no lugar do controle create user wizard um form comum personalizado com caixas de texto e code-behind por exemplo em csharp É mais fácil ainda, assim que ele criar a conta você cria um método de envio de email, não precisa utilizar o MailDefinition. Em seguida <asp:CreateUserWizard ID="CreateUserWizard1" Runat="server"> <MailDefinition BodyFileName="~/RegistrationEmail.txt" From="http://seussite.com" Subject="Thanks for registering!"> </MailDefinition> </asp:CreateUserWizard> Duvida 2 - Como seria feito acima se estou usando no lugar do controle create user wizard um form comum personalizado com caixas de texto e code-behind por exemplo em csharp Dúvida 3 - No caso como eu incluiria o link de validação na logica abaixo e um link adicional para a pagina administrativa do usuário Este link é normal com <a href="suapagina.aspx>Link<a> se precisar passar algum valor você deve concatenar Thank you for registering web site! Follows your credentials for logging-in:
UserName: <% UserName %>
Password: <% Password %> See you online! Duvida 4 - E como seria você deve mudar a lógica acima enviando um link para ele confirmar o registro. Uma flag no banco seria interessante? Teria algum exemplo em video ou algo assim para me facilitar Mudar a lógica é como eu expliquei na resposta 3, cria um método de envio de email e a Flag pode ser um campo char(1) se o campo for N significa que ele é novo usuário, acabou de se cadastrar, quando ele clicar no link e validar você faz um update para A isso que significa que agora ele é ativo, quando ele for fazer a autenticação se o campo não for igual a A você não deixa ele acessar. Espero ter ajudado com as idéias acima.
GOSTEI 0
Luiz Franco
06/03/2009
No caso achei este metodo aqui e o coloquei no evento page load do VS2008 mas ele não recebe o email no HOTMAIL porque, mesmo eu tendo-o o testado online em meu provedor de serviços (LOCAWEB), veja como criei baseado em um exemplo o codigo
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Net.Mail;
using System.Net.Mime;
using System.Net;
namespace EnviaEmail
{
public partial class EnviaEmailAutenticado : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
SmtpClient cliente = new SmtpClient("meuemail@meudominio.com",587);
cliente.EnableSsl = true;
MailAddress from = new MailAddress("meudominio@meudominio.com","NomedeQuemEnvia");
MailAddress to = new MailAddress("meuemail@hotmail.com", "Luiz");
MailMessage mail = new MailMessage(from, to);
mail.Body = "Mensagem no corpo do email.";
mail.Subject = "Assunto do email";
NetworkCredential credenciais = new NetworkCredential("meuemail@meudominio.com", "minhasenha", "");
cliente.Credentials = credenciais;
try
{
cliente.Send(mail);
}
catch
{
}
finally
{
mail.Dispose();
}
}
}
}
Fiz esse teste mas até agora não o recebi na minha conta do hotmail pq isso acontece? O que falta corrigir ? Fico no aguardo e desde já agradeço
GOSTEI 0
Fabio Mans
06/03/2009
Não caiu no SPAM? No da LocaWeb funcionou?
GOSTEI 0
Luiz Franco
06/03/2009
Não não funcionou nem utilizando para destinatário como hotmail, nem funcionou utilizando para um outro email valido que tenho na propria hospedagem
Ai fuçando a LOCAWEB achei esse outro código deles neste link
http://wiki.locaweb.com.br/pt-br/Envio_de_e-mails_via_.NET_utilizando_o_System.Net.Mail#Observa.C3.A7.C3.B5es
Exemplo em C# <%@ Page Language="C#" %>
<script runat="server">
public void Page_Load(Object Sender, EventArgs e)
{
//Cria objeto com dados do e-mail.
System.Net.Mail.MailMessage objEmail = new System.Net.Mail.MailMessage();
//Define o remetente do e-mail.
objEmail.From = new System.Net.Mail.MailAddress("Nome <email@seudominio.com.br>");
//Define os destinatários do e-mail.
objEmail.To.Add("Nome <email@dominio.com.br>");
objEmail.To.Add("Nome <email@dominio.com.br>");
//Enviar cópia para.
objEmail.To.Add("Nome <email@dominio.com.br>");
//Enviar cópia oculta para.
objEmail.Bcc.Add("Nome <email@dominio.com.br>");
//Define a prioridade do e-mail.
objEmail.Priority = System.Net.Mail.MailPriority.Normal;
//Define o formato do e-mail HTML (caso não queira HTML alocar valor false)
objEmail.IsBodyHtml = true;
//Define título do e-mail.
objEmail.Subject = "título do e-mail";
//Define o corpo do e-mail.
objEmail.Body = "Escreva aqui o seu <b>texto</b>";
//Para evitar problemas de caracteres "estranhos", configuramos o charset para "ISO-8859-1"
objEmail.SubjectEncoding = System.Text.Encoding.GetEncoding("ISO-8859-1");
objEmail.BodyEncoding = System.Text.Encoding.GetEncoding("ISO-8859-1");
//Cria objeto com os dados do SMTP
System.Net.Mail.SmtpClient objSmtp = new System.Net.Mail.SmtpClient();
//Alocamos o endereço do host para enviar os e-mails, localhost(recomendado) ou smtp2.locaweb.com.br
objSmtp.Host = "localhost";
//Enviamos o e-mail através do método .send()
try
{
objSmtp.Send(objEmail);
Response.Write("E-mail enviado com sucesso !");
}
catch(Exception ex)
{
Response.Write("Ocorreram problemas no envio do e-mail. Error = " + ex.Message);
}
//excluímos o objeto de e-mail da memória
objEmail.Dispose();
}
</script>
...ainda não testei pois estou esperando conversar com eles, mas já pergunto á vc se este seria o correto?
e fuçando em outro forum link
http://www.forumweb.com.br/foruns/index.php?showtopic=70690
Achei essa dica só não sei se seria a correta tb para o meu objetivo
O problema ocorre só com o Hotmail?
O Hotmail tem muito problema de recepção de mensagens, muitas vezes dão até problema e enviam para "Lixo eletrônico" pergunte ao admin da LocaWeb se seu site está configurado com a configuração de MX ( "v=spf1 a mx ptr ~all" ) o hotmail faz leitura de spf.
Tente com outro e-mail, caso dê certo o problema é o Hotmail. Enfim como eu faria para que emails de destinatários que irão se cadastrar pelo processo de membership no meu site que esta num dominio adicional da locaweb e receberão a msg para validação de cadastro do mesmo usuário que se inscreveu no email dele caso o mesmo seja hotmail, gmail ou yahoo mail...etc
O Hotmail tem muito problema de recepção de mensagens, muitas vezes dão até problema e enviam para "Lixo eletrônico" pergunte ao admin da LocaWeb se seu site está configurado com a configuração de MX ( "v=spf1 a mx ptr ~all" ) o hotmail faz leitura de spf.
Tente com outro e-mail, caso dê certo o problema é o Hotmail. Enfim como eu faria para que emails de destinatários que irão se cadastrar pelo processo de membership no meu site que esta num dominio adicional da locaweb e receberão a msg para validação de cadastro do mesmo usuário que se inscreveu no email dele caso o mesmo seja hotmail, gmail ou yahoo mail...etc
GOSTEI 0
Fabio Mans
06/03/2009
Vamos fazer o seguinte monta um formulário bem simples para mandar email, vamos fazer por partes.
Veja um exemplo abaixo, um exemplo que montei em um site.
Só uma dúvida você nunca enviou email pelo utilizanda a classe MailMessage?
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Untitled Page</title>
<link href="spa.css" rel="stylesheet" type="text/css" />
</head>
<body>
<form id="form1" runat="server">
<table width="49%" border="0" align="center">
<tr>
<td id="info" valign="top">
<span class="style3">
<table style="width: 100%">
<tr>
<td class="style6">
Nome:</td>
<td>
<asp:TextBox ID="nome" runat="server" CssClass="form1" MaxLength="60" Width="185px"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" ControlToValidate="nome"
ErrorMessage="Informe seu nome"></asp:RequiredFieldValidator></td>
</tr>
<tr>
<td class="style6">
Telefone:</td>
<td>
<asp:TextBox ID="telefone" runat="server" CssClass="form1" MaxLength="9" Width="185px"></asp:TextBox></td>
</tr>
<tr>
<td class="style6">
E-mail: <br />
</td>
<td>
<asp:TextBox ID="email" runat="server" CssClass="form1" MaxLength="60" Width="185px"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="email" ErrorMessage="Digite seu email" SetFocusOnError="True" Display="Dynamic"></asp:RequiredFieldValidator>
<asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" ControlToValidate="email"
ErrorMessage="E-mail inválido" SetFocusOnError="True" Display="Dynamic" ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"></asp:RegularExpressionValidator></td>
</tr>
<tr>
<td class="style6">
Mensagem:
</td>
<td>
<asp:TextBox ID="txtMensagem" runat="server" CssClass="form1" Height="50px" TextMode="MultiLine"
Width="253px"></asp:TextBox></td>
</tr>
<tr>
<td>
</td>
<td>
<asp:Button ID="btnEnviar" runat="server" CssClass="form1" OnClick="btnEnviar_Click"
Text="Enviar" /></td>
</tr>
<tr>
<td>
</td>
<td>
<asp:Label ID="lblMsg" runat="server"></asp:Label></td>
</tr>
</table>
</span>
</td>
</tr>
</table>
</form>
</body>
</html>
================================================= public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
nome.Focus(); }
protected void btnEnviar_Click(object sender, EventArgs e)
{
if(Page.IsValid)
{
try
{ txtMensagem.Text = txtMensagem.Text.Replace("\n", "<BR>");
txtMensagem.Text = txtMensagem.Text.Replace("'", "");
string TextoCompleto = txtMensagem.Text;
// create the message
MailMessage mail = new MailMessage();
// set the sender's address and display name
mail.From = new MailAddress(email.Text,nome.Text);
// add a first recipient by specifying only her address
mail.To.Add("mcontabil@mcontabil.com.br");
StringBuilder mensagem = new StringBuilder();
mensagem.Append("Formulário de contato - www.mcontabil.com.br <br>");
mensagem.Append("<br>");
mensagem.Append("==============================================================<br>");
mensagem.Append("<br>");
mensagem.Append("<b>Nome</b>: " + nome.Text + "<br>");
mensagem.Append("<b>E-mail</b>: " + email.Text + "<br>");
mensagem.Append("<b>Telefone</b>: " + telefone.Text + "<br>");
mensagem.Append("<b>Mensagem</b>:<br>");
mensagem.Append(TextoCompleto + "<br>");
mensagem.Append("==============================================================<br>");
mensagem.Append("<br>");
mail.Subject = "Formulário de contato - www.mcontabil.com.br";
mail.Body = mensagem.ToString();
mail.IsBodyHtml = true;
// set the mail’s priority to high
mail.Priority = MailPriority.Normal;
SmtpClient smtpClient = new SmtpClient();
smtpClient.Send(mail); lblMsg.Text = "Mensagem enviada com sucesso";
btnEnviar.Enabled = false; ApagarTextBox(this);
}
catch (Exception ex)
{
lblMsg.Text = ex.Message;
}
}
} private void ApagarTextBox(Control pai)
{
foreach (Control ctl in pai.Controls)
if (ctl is TextBox)
((TextBox)ctl).Text = string.Empty;
else if (ctl.Controls.Count > 0)
ApagarTextBox(ctl);
}
}
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Untitled Page</title>
<link href="spa.css" rel="stylesheet" type="text/css" />
</head>
<body>
<form id="form1" runat="server">
<table width="49%" border="0" align="center">
<tr>
<td id="info" valign="top">
<span class="style3">
<table style="width: 100%">
<tr>
<td class="style6">
Nome:</td>
<td>
<asp:TextBox ID="nome" runat="server" CssClass="form1" MaxLength="60" Width="185px"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" ControlToValidate="nome"
ErrorMessage="Informe seu nome"></asp:RequiredFieldValidator></td>
</tr>
<tr>
<td class="style6">
Telefone:</td>
<td>
<asp:TextBox ID="telefone" runat="server" CssClass="form1" MaxLength="9" Width="185px"></asp:TextBox></td>
</tr>
<tr>
<td class="style6">
E-mail: <br />
</td>
<td>
<asp:TextBox ID="email" runat="server" CssClass="form1" MaxLength="60" Width="185px"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="email" ErrorMessage="Digite seu email" SetFocusOnError="True" Display="Dynamic"></asp:RequiredFieldValidator>
<asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" ControlToValidate="email"
ErrorMessage="E-mail inválido" SetFocusOnError="True" Display="Dynamic" ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"></asp:RegularExpressionValidator></td>
</tr>
<tr>
<td class="style6">
Mensagem:
</td>
<td>
<asp:TextBox ID="txtMensagem" runat="server" CssClass="form1" Height="50px" TextMode="MultiLine"
Width="253px"></asp:TextBox></td>
</tr>
<tr>
<td>
</td>
<td>
<asp:Button ID="btnEnviar" runat="server" CssClass="form1" OnClick="btnEnviar_Click"
Text="Enviar" /></td>
</tr>
<tr>
<td>
</td>
<td>
<asp:Label ID="lblMsg" runat="server"></asp:Label></td>
</tr>
</table>
</span>
</td>
</tr>
</table>
</form>
</body>
</html>
================================================= public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
nome.Focus(); }
protected void btnEnviar_Click(object sender, EventArgs e)
{
if(Page.IsValid)
{
try
{ txtMensagem.Text = txtMensagem.Text.Replace("\n", "<BR>");
txtMensagem.Text = txtMensagem.Text.Replace("'", "");
string TextoCompleto = txtMensagem.Text;
// create the message
MailMessage mail = new MailMessage();
// set the sender's address and display name
mail.From = new MailAddress(email.Text,nome.Text);
// add a first recipient by specifying only her address
mail.To.Add("mcontabil@mcontabil.com.br");
StringBuilder mensagem = new StringBuilder();
mensagem.Append("Formulário de contato - www.mcontabil.com.br <br>");
mensagem.Append("<br>");
mensagem.Append("==============================================================<br>");
mensagem.Append("<br>");
mensagem.Append("<b>Nome</b>: " + nome.Text + "<br>");
mensagem.Append("<b>E-mail</b>: " + email.Text + "<br>");
mensagem.Append("<b>Telefone</b>: " + telefone.Text + "<br>");
mensagem.Append("<b>Mensagem</b>:<br>");
mensagem.Append(TextoCompleto + "<br>");
mensagem.Append("==============================================================<br>");
mensagem.Append("<br>");
mail.Subject = "Formulário de contato - www.mcontabil.com.br";
mail.Body = mensagem.ToString();
mail.IsBodyHtml = true;
// set the mail’s priority to high
mail.Priority = MailPriority.Normal;
SmtpClient smtpClient = new SmtpClient();
smtpClient.Send(mail); lblMsg.Text = "Mensagem enviada com sucesso";
btnEnviar.Enabled = false; ApagarTextBox(this);
}
catch (Exception ex)
{
lblMsg.Text = ex.Message;
}
}
} private void ApagarTextBox(Control pai)
{
foreach (Control ctl in pai.Controls)
if (ctl is TextBox)
((TextBox)ctl).Text = string.Empty;
else if (ctl.Controls.Count > 0)
ApagarTextBox(ctl);
}
}
GOSTEI 0
Luiz Franco
06/03/2009
Vou testar o codigo que vc me enviou depois dou um retorno, não nunca usei a classe mail.message no caso do script da locaweb com o codigo que eu vi no link deles funcionou, só funciona com smtp = localhost ou smtp2 como esta no link deles
Mas nunca usei a classe mail.message não e baseado no codigo que vc me enviou aonde coloco ou insiro o meu smtp e porta se precisar
Fico no aguardo e desde já agradeço
GOSTEI 0
Fabio Mans
06/03/2009
Eu costumo colocar no Web.Config, mas você pode fazer via código.
Exemplo no Web.Config
Abaixo do system.web
</system.web>
<system.net>
<mailSettings>
<smtp from="xxxxxx@mcontabil.com.br">
<network host="smtp.xxxx.com.br" password="senha" userName="xxxx@mcontabil.com.br"/>
</smtp>
</mailSettings>
</system.net>
Se você utiliza o Outlook basta copiar as configurações.
Exemplo no Web.Config
Abaixo do system.web
</system.web>
<system.net>
<mailSettings>
<smtp from="xxxxxx@mcontabil.com.br">
<network host="smtp.xxxx.com.br" password="senha" userName="xxxx@mcontabil.com.br"/>
</smtp>
</mailSettings>
</system.net>
Se você utiliza o Outlook basta copiar as configurações.
GOSTEI 0
Luiz Franco
06/03/2009
Olá Fabio Galante boas
Baseado no método que ativa o usuario member ship depois da validação via email que vc me passou como abaixo, apenas tiver que fazer uma pequena mudança IsAproved = true no lugar de Unlocked
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Security;
namespace PainelPSBR
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//Verifica se a QueryString nula ou no
if (Request.QueryString["usuario"] != null)
{
//Atribui o usuario recuperado pela QueryString
// variavel string usuario
string usuario = Request.QueryString["usuario"].ToString();
//Pesquisa o nome do usuario recuperado e atribuido
// variavel string usuario na classe Membership metodo GetUser
//e o atribui variavel criada userInfo da classe MembershipUser
MembershipUser userInfo = Membership.GetUser(usuario);
//Verifica se userInfo diferente de nulo
//ou seja se for nulo porque no o encontrou
//No cadastro do MemberShip
//Se for diferente de nulo valida e desbloqueia
if (userInfo != null)
{
//Desbloquea o Usuario atraves da Propriedade UnlockUser;
userInfo.IsApproved = true;
Response.Write("Usurio " + userInfo + " Validado com Sucesso!!!");
}
else
{
Response.Write("Usurio no encontrado!!!");
}
}
}
}
}
E o que aconteceu em duas tentativas que fiz, colocando ao executar a pagina na QueryString do cabeçalho Http como se segue
http://localhost:1390/Default.aspx?usuario=Admin (Veio como resposta Usuario Admin Validado com Sucesso!!!) Lembrando que ele já tinha sido validado pela ferramenta administrativa do asp.net neste caso não mudou nada e o isApproved continuou true
Bem no segundo teste
http://localhost:1390/Default.aspx?usuario=LuizAntonio (Veio como resposta Usuário LuizAntonio Validado com Sucesso!!! )Porem quando eu fiz Refresh na base de dados e na table aspnet_MemberShip os dados dos campos , IsApproved e IsLockeOut continuam os mesmos ou seja
Usuario:Admin - IsApproved = True e IsLockedOut = False
Usuario:LuizAntonio - IsApproved = False e IsLockedOut = False
Abaixo o meu web.config da app
<?xml version="1.0"?>
<configuration>
<configSections>
<sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<section name="scriptResourceHandler" type="System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>
<sectionGroup name="webServices" type="System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="Everywhere"/>
<section name="profileService" type="System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>
<section name="authenticationService" type="System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>
<section name="roleService" type="System.Web.Configuration.ScriptingRoleServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>
</sectionGroup>
</sectionGroup>
</sectionGroup>
</configSections>
<appSettings/>
<connectionStrings>
<remove name="LocalSqlServer"/>
<add name="MembershipConnection" connectionString="Data Source=.\sqlexpress;Initial Catalog=BancoAspNetLinhadeCodigo;Integrated Security=True" providerName="System.Data.SqlClient"/>
<add connectionString="server=mysql1;database=mysqldb1;user id=userid1;pwd=mypwd1" name="SimpleProviderConnectionString" providerName="MySql.Data.MySqlClient"/>
<add connectionString="server=mysql2;database=mysqldb2;user id=userid2;pwd=mypwd2" name="SiteString" providerName="MySql.Data.MySqlClient"/>
</connectionStrings>
<system.web>
<!--
Set compilation debug="true" to insert debugging
symbols into the compiled page. Because this
affects performance, set this value to true only
during development.
-->
<globalization requestEncoding="ISO-8859-1" responseEncoding="ISO-8859-1" culture="pt-BR"/>
<compilation debug="true">
<assemblies>
<add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
<add assembly="System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
<add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add assembly="System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
</assemblies>
</compilation>
<!--
The <authentication> section enables configuration
of the security authentication mode used by
ASP.NET to identify an incoming user.
-->
<authentication mode="Forms"/>
<!--<profile configSource="ProfileSection.config"/>-->
<customErrors mode="RemoteOnly" defaultRedirect="aviso.aspx"/>
<sessionState timeout="1"/>
<membership defaultProvider="SqlProvider" userIsOnlineTimeWindow="15">
<providers>
<clear/>
<add name="SqlProvider" type="System.Web.Security.SqlMemberShipProvider" connectionStringName="MembershipConnection"/>
</providers>
</membership>
<!--
The <customErrors> section enables configuration
of what to do if/when an unhandled error occurs
during the execution of a request. Specifically,
it enables developers to configure html error pages
to be displayed in place of a error stack trace.
<customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
<error statusCode="403" redirect="NoAccess.htm" />
<error statusCode="404" redirect="FileNotFound.htm" />
</customErrors>
-->
<pages>
<controls>
<add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add tagPrefix="asp" namespace="System.Web.UI.WebControls" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</controls>
</pages>
<httpHandlers>
<remove verb="*" path="*.asmx"/>
<add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false"/>
</httpHandlers>
<httpModules>
<add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</httpModules>
</system.web>
<system.codedom>
<compilers>
<compiler language="c#;cs;csharp" extension=".cs" warningLevel="4" type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<providerOption name="CompilerVersion" value="v3.5"/>
<providerOption name="WarnAsError" value="false"/>
</compiler>
</compilers>
</system.codedom>
<!--
The system.webServer section is required for running ASP.NET AJAX under Internet
Information Services 7.0. It is not necessary for previous version of IIS.
-->
<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules>
<remove name="ScriptModule"/>
<add name="ScriptModule" preCondition="managedHandler" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</modules>
<handlers>
<remove name="WebServiceHandlerFactory-Integrated"/>
<remove name="ScriptHandlerFactory"/>
<remove name="ScriptHandlerFactoryAppServices"/>
<remove name="ScriptResource"/>
<add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add name="ScriptResource" preCondition="integratedMode" verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</handlers>
</system.webServer>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Web.Extensions" publicKeyToken="31bf3856ad364e35"/>
<bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Extensions.Design" publicKeyToken="31bf3856ad364e35"/>
<bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
Fico no aguardo e desde já agradeço para saber o que está ocorrendo na validação que não está validando por enquanto
GOSTEI 0
Luiz Franco
06/03/2009
Olá consegui validar o usuário o que estava faltando no codigo éra a linha do
Membership.UpdateUser(userInfo);
Como mostra abaixo o codigo completo
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Security;
using System.Web.UI.HtmlControls;
using WebProdutos.Encrypto;
namespace PainelPSBR
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//Verifica se a QueryString nula ou no
if (Request["usuario"] != null)
{
//Atribui o usuario recuperado pela QueryString
// variavel string usuario
string usuario = Request["usuario"].ToString();
//Mtodo de Cryptografia Hash
//Pesquisa o nome do usuario recuperado e atribuido
// variavel string usuario na classe Membership metodo GetUser
//e o atribui variavel criada userInfo da classe MembershipUser
MembershipUser userInfo = Membership.GetUser(usuario);
//Verifica se userInfo diferente de nulo
//ou seja se for nulo porque no o encontrou
//No cadastro do MemberShip
//Se for diferente de nulo valida e desbloqueia
if (userInfo != null)
{
//Desbloquea o Usuario atraves da Propriedade UnlockUser;
userInfo.IsApproved = true;
//Atualiza os Dados na Base MemberShip
//para Este Usurio
Membership.UpdateUser(userInfo);
Response.Write("Usurio " + userInfo + " Validado com Sucesso!!!");
}
else
{
Response.Write("Usurio no encontrado!!!");
}
}
}
}
}
Só que eu gostaria de saber se haveria alguma forma de por exemplo deixar o MemberShip userInfo como HASH na linha de comparação tipo assim
MembershipUser Hash(userInfo) = Membership.GetUser(usuario); //Já que pretendo que o (usuario) solicitado via querystring seja em Hash
Fico no aguardo e desde já agradeço
MembershipUser Hash(userInfo) = Membership.GetUser(usuario); //Já que pretendo que o (usuario) solicitado via querystring seja em Hash
Fico no aguardo e desde já agradeço
GOSTEI 0
Fabio Mans
06/03/2009
Para ficar Hash você tem que modificar o Web.Config, pesquise sobre este assunto.
<membership defaultProvider="SqlMembershipProvider"
userIsOnlineTimeWindow="15">
<providers>
<add
name="SqlMembershipProvider"
type="System.Web.Security.SqlMembershipProvider"
connectionStringName="SqlConnString"
applicationName="WebSite1"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="false"
requiresUniqueEmail="false"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
passwordAttemptWindow="10"
minRequiredPasswordLength="6"
minRequiredNonalphanumericCharacters="0"/>
</providers>
</membership>
O melhor tutorial sobre Membership você encontra neste link.
http://www.asp.net/learn/security/tutorial-04-cs.aspx
<membership defaultProvider="SqlMembershipProvider"
userIsOnlineTimeWindow="15">
<providers>
<add
name="SqlMembershipProvider"
type="System.Web.Security.SqlMembershipProvider"
connectionStringName="SqlConnString"
applicationName="WebSite1"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="false"
requiresUniqueEmail="false"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
passwordAttemptWindow="10"
minRequiredPasswordLength="6"
minRequiredNonalphanumericCharacters="0"/>
</providers>
</membership>
O melhor tutorial sobre Membership você encontra neste link.
http://www.asp.net/learn/security/tutorial-04-cs.aspx
GOSTEI 0
Luiz Franco
06/03/2009
Olá Fabio - boas
A senha por default já está em HASH, o que eu preciso seria algo assim, baseado no metodo de validação de usuario que vc me disse
eu crio na hora de ele cadastrar um parametro string paralelo em HASH do nome do usuario tipo
http://localhost:1390/VerificarUsuarioEmailReader.aspx?ID=tc6pCV1TfHoUfIg+4ujvrzTGdLI7SiZQdujyO9H+hnkxQVt/aHvrtkUZthy/zpC3fUkHn4COTql66MeJexrHJA==
para comparar com o metodo
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Security;
using System.Web.UI.HtmlControls;
using Encrypto;
namespace PainelPSBR
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//Verifica se a QueryString nula ou no
if (Request["ID"] != null)
{
//Atribui o usuario recuperado pela QueryString
// variavel string usuario
string usuario = Request["ID"].ToString();
//Pesquisa o nome do usuario recuperado e atribuido
// variavel string usuario na classe Membership metodo GetUser
//e o atribui variavel criada userInfo da classe MembershipUser
MembershipUser HASH(userInfo) = Membership.GetUser(usuario);
//Verifica se userInfo diferente de nulo
//ou seja se for nulo porque no o encontrou
//No cadastro do MemberShip
//Se for diferente de nulo valida e desbloqueia
if (userInfo != null)
{
//Desbloquea o Usuario atraves da Propriedade UnlockUser;
userInfo.IsApproved = true;
//Atualiza os Dados na Base MemberShip
//para Este Usurio
Membership.UpdateUser(userInfo);
Response.Write("Usurio " + userInfo + " Validado com Sucesso!!!");
}
else
{
Response.Write("Usurio no encontrado!!!");
}
}
}
}
}
Seria isso que preciso tem como se fazer isso? Ou seja o usuario no banco ele continua com nome normal - meunomeusuario mas é comparado com a querystring ID ácima que vem HASHEADA pelo nomedousuario
ID = tc6pCV1TfHoUfIg+4ujvrzTGdLI7SiZQdujyO9H+hnkxQVt/aHvrtkUZthy/zpC3fUkHn4COTql66MeJexrHJA==
que se equivale ao nome do usuario no BANCO = LuizAntonio
Fico no aguardo e desde já agradeço
GOSTEI 0
Fabio Mans
06/03/2009
Eu utilizo a classe abaixo para criptografar Query String
using System;
using System.Web;
using System.Security.Cryptography;
using System.IO;
using System.Text;
using System.Collections.Specialized;
//COMO UTILIZAR
//CRIPTOGRAFAR
//void Master_AddButton_Click(object sender, EventArgs e)
//{
//Response.Redirect("User.aspx" + EncryptQueryString("id=0"));
//}
//DESCRIPTOGRAFAR
//Decrypt the query string
//NameValueCollection queryString = DecryptQueryString(Request.QueryString.ToString());
//if (queryString != null)
//{
////Check if the id was passed in.
//string id = queryString["id"];
//}
public class StringHelpers
{
#region Constants
private const char QUERY_STRING_DELIMITER = '&';
#endregion Constants
#region Members
private static RijndaelManaged _cryptoProvider;
//128 bit encyption: DO NOT CHANGE
private static readonly byte[] Key = { 18, 19, 8, 24, 36, 22, 4, 22, 17, 5, 11, 9, 13, 15, 06, 23 };
private static readonly byte[] IV = { 14, 2, 16, 7, 5, 9, 17, 8, 4, 47, 16, 12, 1, 32, 25, 18 };
#endregion Members
#region Constructor
static StringHelpers()
{
_cryptoProvider = new RijndaelManaged();
_cryptoProvider.Mode = CipherMode.CBC;
_cryptoProvider.Padding = PaddingMode.PKCS7;
}
#endregion Constructor
#region Methods
/// <summary>
/// Encrypts a given string.
/// </summary>
/// <param name="unencryptedString">Unencrypted string</param>
/// <returns>Returns an encrypted string</returns>
public static string Encrypt(string unencryptedString)
{
byte[] bytIn = ASCIIEncoding.ASCII.GetBytes(unencryptedString);
// Create a MemoryStream
MemoryStream ms = new MemoryStream();
// Create Crypto Stream that encrypts a stream
CryptoStream cs = new CryptoStream(ms,
_cryptoProvider.CreateEncryptor(Key, IV),
CryptoStreamMode.Write);
// Write content into MemoryStream
cs.Write(bytIn, 0, bytIn.Length);
cs.FlushFinalBlock();
byte[] bytOut = ms.ToArray();
return Convert.ToBase64String(bytOut);
}
/// <summary>
/// Decrypts a given string.
/// </summary>
/// <param name="encryptedString">Encrypted string</param>
/// <returns>Returns a decrypted string</returns>
public static string Decrypt(string encryptedString)
{
if (encryptedString.Trim().Length != 0)
{
// Convert from Base64 to binary
byte[] bytIn = Convert.FromBase64String(encryptedString);
// Create a MemoryStream
MemoryStream ms = new MemoryStream(bytIn, 0, bytIn.Length);
// Create a CryptoStream that decrypts the data
CryptoStream cs = new CryptoStream(ms,
_cryptoProvider.CreateDecryptor(Key, IV),
CryptoStreamMode.Read);
// Read the Crypto Stream
StreamReader sr = new StreamReader(cs);
return sr.ReadToEnd();
}
else
{
return "";
}
}
public static NameValueCollection DecryptQueryString(string queryString)
{
if (queryString.Length != 0)
{
//Decode the string
string decodedQueryString = HttpUtility.UrlDecode(queryString);
//Decrypt the string
string decryptedQueryString = StringHelpers.Decrypt(decodedQueryString);
//Now split the string based on each parameter
string[] actionQueryString = decryptedQueryString.Split(new char[] { QUERY_STRING_DELIMITER });
NameValueCollection newQueryString = new NameValueCollection();
//loop around for each name value pair.
for (int index = 0; index < actionQueryString.Length; index++)
{
string[] queryStringItem = actionQueryString[index].Split(new char[] { '=' });
newQueryString.Add(queryStringItem[0], queryStringItem[1]);
}
return newQueryString;
}
else
{
//No query string was passed in.
return null;
}
}
public static string EncryptQueryString(NameValueCollection queryString)
{
//create a string for each value in the query string passed in.
string tempQueryString = "";
for (int index = 0; index < queryString.Count; index++)
{
tempQueryString += queryString.GetKey(index) + "=" + queryString[index];
if (index != queryString.Count - 1)
{
tempQueryString += QUERY_STRING_DELIMITER;
}
}
return EncryptQueryString(tempQueryString);
}
/// <summary>
/// You must pass in a string that uses the QueryStringHelper.DELIMITER as the delimiter.
/// This will also append the "?" to the beginning of the query string.
/// </summary>
/// <param name="queryString"></param>
/// <returns></returns>
public static string EncryptQueryString(string queryString)
{
return "?" + HttpUtility.UrlEncode(StringHelpers.Encrypt(queryString));
}
#endregion Methods
}
using System;
using System.Web;
using System.Security.Cryptography;
using System.IO;
using System.Text;
using System.Collections.Specialized;
//COMO UTILIZAR
//CRIPTOGRAFAR
//void Master_AddButton_Click(object sender, EventArgs e)
//{
//Response.Redirect("User.aspx" + EncryptQueryString("id=0"));
//}
//DESCRIPTOGRAFAR
//Decrypt the query string
//NameValueCollection queryString = DecryptQueryString(Request.QueryString.ToString());
//if (queryString != null)
//{
////Check if the id was passed in.
//string id = queryString["id"];
//}
public class StringHelpers
{
#region Constants
private const char QUERY_STRING_DELIMITER = '&';
#endregion Constants
#region Members
private static RijndaelManaged _cryptoProvider;
//128 bit encyption: DO NOT CHANGE
private static readonly byte[] Key = { 18, 19, 8, 24, 36, 22, 4, 22, 17, 5, 11, 9, 13, 15, 06, 23 };
private static readonly byte[] IV = { 14, 2, 16, 7, 5, 9, 17, 8, 4, 47, 16, 12, 1, 32, 25, 18 };
#endregion Members
#region Constructor
static StringHelpers()
{
_cryptoProvider = new RijndaelManaged();
_cryptoProvider.Mode = CipherMode.CBC;
_cryptoProvider.Padding = PaddingMode.PKCS7;
}
#endregion Constructor
#region Methods
/// <summary>
/// Encrypts a given string.
/// </summary>
/// <param name="unencryptedString">Unencrypted string</param>
/// <returns>Returns an encrypted string</returns>
public static string Encrypt(string unencryptedString)
{
byte[] bytIn = ASCIIEncoding.ASCII.GetBytes(unencryptedString);
// Create a MemoryStream
MemoryStream ms = new MemoryStream();
// Create Crypto Stream that encrypts a stream
CryptoStream cs = new CryptoStream(ms,
_cryptoProvider.CreateEncryptor(Key, IV),
CryptoStreamMode.Write);
// Write content into MemoryStream
cs.Write(bytIn, 0, bytIn.Length);
cs.FlushFinalBlock();
byte[] bytOut = ms.ToArray();
return Convert.ToBase64String(bytOut);
}
/// <summary>
/// Decrypts a given string.
/// </summary>
/// <param name="encryptedString">Encrypted string</param>
/// <returns>Returns a decrypted string</returns>
public static string Decrypt(string encryptedString)
{
if (encryptedString.Trim().Length != 0)
{
// Convert from Base64 to binary
byte[] bytIn = Convert.FromBase64String(encryptedString);
// Create a MemoryStream
MemoryStream ms = new MemoryStream(bytIn, 0, bytIn.Length);
// Create a CryptoStream that decrypts the data
CryptoStream cs = new CryptoStream(ms,
_cryptoProvider.CreateDecryptor(Key, IV),
CryptoStreamMode.Read);
// Read the Crypto Stream
StreamReader sr = new StreamReader(cs);
return sr.ReadToEnd();
}
else
{
return "";
}
}
public static NameValueCollection DecryptQueryString(string queryString)
{
if (queryString.Length != 0)
{
//Decode the string
string decodedQueryString = HttpUtility.UrlDecode(queryString);
//Decrypt the string
string decryptedQueryString = StringHelpers.Decrypt(decodedQueryString);
//Now split the string based on each parameter
string[] actionQueryString = decryptedQueryString.Split(new char[] { QUERY_STRING_DELIMITER });
NameValueCollection newQueryString = new NameValueCollection();
//loop around for each name value pair.
for (int index = 0; index < actionQueryString.Length; index++)
{
string[] queryStringItem = actionQueryString[index].Split(new char[] { '=' });
newQueryString.Add(queryStringItem[0], queryStringItem[1]);
}
return newQueryString;
}
else
{
//No query string was passed in.
return null;
}
}
public static string EncryptQueryString(NameValueCollection queryString)
{
//create a string for each value in the query string passed in.
string tempQueryString = "";
for (int index = 0; index < queryString.Count; index++)
{
tempQueryString += queryString.GetKey(index) + "=" + queryString[index];
if (index != queryString.Count - 1)
{
tempQueryString += QUERY_STRING_DELIMITER;
}
}
return EncryptQueryString(tempQueryString);
}
/// <summary>
/// You must pass in a string that uses the QueryStringHelper.DELIMITER as the delimiter.
/// This will also append the "?" to the beginning of the query string.
/// </summary>
/// <param name="queryString"></param>
/// <returns></returns>
public static string EncryptQueryString(string queryString)
{
return "?" + HttpUtility.UrlEncode(StringHelpers.Encrypt(queryString));
}
#endregion Methods
}
GOSTEI 0
Luiz Franco
06/03/2009
Ok mas esta é uma Cryptografia Simetrica correto? Mas no caso o que eu preciso é que seja uma Cryptografia HASH na querytring para sêr comparado com o usuario cadastrado no membership como já postei na duvida anterior é possivel isso mas com Cryptografia HASH e não simétrica?
GOSTEI 0
Fabio Mans
06/03/2009
Todos os IDS na tabelas do Membership utilizam GUID, por que não recupera e utiliza ao invés de criptografar?
GOSTEI 0
Luiz Franco
06/03/2009
Olá Fabio Galante - boas
Como eu faria essa recuperação via GUID para validar o email, pressupondo esta logica
Na pagina de cadastro via membership mas com um form personalizado no codigo
1) Eu cadastro primeiro o usuario no member ship com isapproved = false;
2) Recupero o Guid deste usuario cadastrado e coloco como parametro no link de validação de email
3)na pagina de validação como recupero esse guid do parametro do link de email
Enfim baseado na logica ácima (como eu o faria via codigo tem como me passar algum exemplo)
E é seguro desta forma?
Fico no aguardo e desde já agradeço
GOSTEI 0
Fabio Mans
06/03/2009
1 - Para você recuperar o Guid do usuário utilize o Exemplo baixo.
string strUser = Membership.GetUser().ToString();
Guid id = (Guid)Membership.GetUser("userName").ProviderUserKey; 2 - Coloca o Guid no link. 3 - Na página você pode fazer como no exemplo abaixo, só que ativando pelo Membership. O exemplo abaixo eu não utilizo o Membership. protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack && !string.IsNullOrEmpty(Request.QueryString["Chave"]))
AtivaPessoa();
else
LblMensagem.Text = "Chave inválida";
} private void AtivaPessoa()
{
string chave = Request.QueryString["Chave"];
if (PessoaBLL.Ativar(chave))
{
LblMensagem.Text = "Conta ativada com sucesso.";
LnkAutentica.Visible = true;
}
else
LblMensagem.Text = "Chavae inválida ou conta já ativada.";
}
=============================================================================================
Olá Fabio Galante - boas
Como eu faria essa recuperação via GUID para validar o email, pressupondo esta logica
Na pagina de cadastro via membership mas com um form personalizado no codigo
1) Eu cadastro primeiro o usuario no member ship com isapproved = false;
2) Recupero o Guid deste usuario cadastrado e coloco como parametro no link de validação de email
3)na pagina de validação como recupero esse guid do parametro do link de email
Enfim baseado na logica ácima (como eu o faria via codigo tem como me passar algum exemplo)
E é seguro desta forma?
Fico no aguardo e desde já agradeço
GOSTEI 0
Devmedia
06/03/2009
Luiz,
a resposta dada pelo consultor solucionou sua dúvida? podemos encerrar o chamado?
a resposta dada pelo consultor solucionou sua dúvida? podemos encerrar o chamado?
GOSTEI 0
Devmedia
06/03/2009
Luiz,
por falta de retorno estamos modificando o status do seu chamado para concluído. Caso ainda possua alguma dúvida sobre esse chamado, por favor, poste aqi para que possamos resolver.
por falta de retorno estamos modificando o status do seu chamado para concluído. Caso ainda possua alguma dúvida sobre esse chamado, por favor, poste aqi para que possamos resolver.
GOSTEI 0
Luiz Franco
06/03/2009
Olá Fabio só para concluir como eu poderia chamar ou reconhecer o username cadastrado para utilizar o Guid no mesmo metodo de onde ele é cadastrado fico no aguardo e desde já agradeço
1 - Para você recuperar o Guid do usuário utilize o Exemplo baixo.
string strUser = Membership.GetUser().ToString();
Guid id = (Guid)Membership.GetUser("userName").ProviderUserKey;
string strUser = Membership.GetUser().ToString();
Guid id = (Guid)Membership.GetUser("userName").ProviderUserKey;
GOSTEI 0
Fabio Mans
06/03/2009
string strUser = Membership.GetUser().ToString();
Guid id = (Guid)Membership.GetUser(strUser ).ProviderUserKey;
[]´s
Guid id = (Guid)Membership.GetUser(strUser ).ProviderUserKey;
[]´s
GOSTEI 0
Luiz Franco
06/03/2009
Olá então no meu metodo de cadastro eu faria isso
Membership.CreateUser(txtUserName.Text, "!mypass2006", email, txtPergSecr.Text, txtRespSecr.Text, false);
e
na proxima linha como abaixo
string strUser = Membership.GetUser().ToString();
Guid id = (Guid)Membership.GetUser(strUser ).ProviderUserKey; Fico no aguardo e desde já agradeço
Guid id = (Guid)Membership.GetUser(strUser ).ProviderUserKey; Fico no aguardo e desde já agradeço
GOSTEI 0
Fabio Mans
06/03/2009
Isso com o Id.ToString() você passa na QueryString. Já testou?
GOSTEI 0
Luiz Franco
06/03/2009
Mas por exemplo se o usuário que se cadastrar via form e no code-behind nesta sequencia de codigo
Membership.CreateUser(txtUserName.Text, "!mypass2006", email, txtPergSecr.Text, txtRespSecr.Text, false);
e
na proxima linha como abaixo
string strUser = Membership.GetUser().ToString();
a linha onde está strUser, ele recuperará o último usuário cadastrado da linha Membership.CreateUser, mesmo ele ainda não estando logado ou o usuário cadastrado em questão? Fico no aguardo e desde já agradeço
a linha onde está strUser, ele recuperará o último usuário cadastrado da linha Membership.CreateUser, mesmo ele ainda não estando logado ou o usuário cadastrado em questão? Fico no aguardo e desde já agradeço
GOSTEI 0
Fabio Mans
06/03/2009
protected void Button1_Click(object sender, EventArgs e)
{
MembershipCreateStatus status;
MembershipUser newUser = Membership.CreateUser("claudia", "pas$wrod", "fgamans@gmail.com","nomedog","filo",false,out status);
string strUser = Membership.GetUser("claudia").ToString();
Guid id = (Guid)Membership.GetUser(strUser).ProviderUserKey;
//ou
string guid = newUser.ProviderUserKey.ToString();
Response.Write(id + "<br>");
Response.Write(guid);
//47aedbd3-0edb-4b77-b36a-442a693a75fc
//47aedbd3-0edb-4b77-b36a-442a693a75fc
}
Com newUser você consegue tudo o que precisa do novo usuário.
Espero ter ajudado
Fabio
{
MembershipCreateStatus status;
MembershipUser newUser = Membership.CreateUser("claudia", "pas$wrod", "fgamans@gmail.com","nomedog","filo",false,out status);
string strUser = Membership.GetUser("claudia").ToString();
Guid id = (Guid)Membership.GetUser(strUser).ProviderUserKey;
//ou
string guid = newUser.ProviderUserKey.ToString();
Response.Write(id + "<br>");
Response.Write(guid);
//47aedbd3-0edb-4b77-b36a-442a693a75fc
//47aedbd3-0edb-4b77-b36a-442a693a75fc
}
Com newUser você consegue tudo o que precisa do novo usuário.
Espero ter ajudado
Fabio
GOSTEI 0
Devmedia
06/03/2009
Luiz,
a resposta do consultor foi suficiente. Podemos encerrar o chamado?
a resposta do consultor foi suficiente. Podemos encerrar o chamado?
GOSTEI 0
Luiz Franco
06/03/2009
Sim pode
Obrigado desde já !!!
GOSTEI 0