Fórum controle CreateUserWizard #377984

20/05/2010

0

Boa tarde!   Tenho uma classe chamada Usuario que herda da classe MembershipProvider. Não uso as tabelas do aspnet para autenticação, tenho tabelas próprias já criadas no banco de dados para armazenar os dados do usuário.   Em uma página, estou tentando fazer uso do controle CreateUserWizard para inserção e atualização dos dados do usuário na minha tabela do banco de dados. Existem alguns campos que preciso acrescentar e não pode ser colocado para preenchimento em outros passos do controle, precisa estar junto onde preenche login, senha, e-mail e etc.   Quando o usuário clica no botão "Create User", ele passa para o método herdado CreateUser () que está na minha classe Usuario. Para eu passar demais informações além do que é passado por parâmetro no método CreateUser(), a única maneira é eu ter propriedades estaticas na minha classe e fazer isso no evento CreatingUser do controle CreateUserWizard()?   Minha outra dúvida é, no web.config, define para o provider do membership o atributo passwordFormat="Hashed" mas ao ver o valor do parâmetro password, a senha estava descriptografada. Por eu ter herdado a classe MembershipProvider e ter sobrescrito o método CreateUser(), terei que fazer a criptografia da senha manualmente?   Fico no aguardo! Obrigado pela atenção!
Carlos Nogueira

Carlos Nogueira

Responder

Posts

20/05/2010

Fabio Mans

1 - Quando o usuário clica no botão "Create User", ele passa para o método herdado CreateUser () que está na minha classe Usuario. Para eu passar demais informações além do que é passado por parâmetro no método CreateUser(), a única maneira é eu ter propriedades estaticas na minha classe e fazer isso no evento CreatingUser do controle CreateUserWizard()?

Resposta

Pelo que eu vi acredito que sim

Seguinte este meu tutorial http://www.aspneti.com.br/Customizando+o+Membership+e+Role+Provider+344,0.aspx

Se você tentar alterar os parâmetros do método CreateUser acusa erro. Outra idéia é criar um outro método e não utilizar o CreateUser.





    public override MembershipUser CreateUser(string ramal,string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status)
    {
        throw new NotImplementedException();
    }


2 - Minha outra dúvida é, no web.config, define para o provider do membership o atributo passwordFormat="Hashed" mas ao ver o valor do parâmetro password, a senha estava descriptografada. Por eu ter herdado a classe MembershipProvider e ter sobrescrito o método CreateUser(), terei que fazer a criptografia da senha manualmente?


Post seu Web.Config, mas para adiantar você precisa de uma Key, veja um exemplo


<membership defaultProvider="News_MembershipProvider" userIsOnlineTimeWindow="15">
            <providers>
                <add name="News_MembershipProvider" connectionStringName="LocalSqlServer" applicationName="/" enablePasswordRetrieval="true" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="true" passwordFormat="Encrypted" maxInvalidPasswordAttempts="5" passwordAttemptWindow="10" minRequiredPasswordLength="4" minRequiredNonalphanumericCharacters="0" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
            </providers>
        </membership>
        <machineKey validationKey="287C5D125D6B7E7223E1F719E3D58D17BB967703017E1BBE28618FAC6C4501E910C7E59800B5D4C2EDD5B0ED98874A3E952D60BAF260D9D374A74C76CB741803" decryptionKey="5C1D8BD9DF3E1B4E1D01132F234266616E0D5EF772FE80AB" validation="SHA1"/>
        <siteMap defaultProvider="News_SiteMapProvider" enabled="true">


http://weblogs.asp.net/owscott/archive/2005/05/11/406550.aspx


http://www.eggheadcafe.com/articles/GenerateMachineKey/GenerateMachineKey.aspx



Fabio



===================================================================



Boa tarde!   Tenho uma classe chamada Usuario que herda da classe MembershipProvider. Não uso as tabelas do aspnet para autenticação, tenho tabelas próprias já criadas no banco de dados para armazenar os dados do usuário.   Em uma página, estou tentando fazer uso do controle CreateUserWizard para inserção e atualização dos dados do usuário na minha tabela do banco de dados. Existem alguns campos que preciso acrescentar e não pode ser colocado para preenchimento em outros passos do controle, precisa estar junto onde preenche login, senha, e-mail e etc.   Quando o usuário clica no botão "Create User", ele passa para o método herdado CreateUser () que está na minha classe Usuario. Para eu passar demais informações além do que é passado por parâmetro no método CreateUser(), a única maneira é eu ter propriedades estaticas na minha classe e fazer isso no evento CreatingUser do controle CreateUserWizard()?   Minha outra dúvida é, no web.config, define para o provider do membership o atributo passwordFormat="Hashed" mas ao ver o valor do parâmetro password, a senha estava descriptografada. Por eu ter herdado a classe MembershipProvider e ter sobrescrito o método CreateUser(), terei que fazer a criptografia da senha manualmente?   Fico no aguardo! Obrigado pela atenção!
Responder

Gostei + 0

20/05/2010

Carlos Nogueira

Oi Fabio,   Entendo, eu já havia encontrado seu artigo anteriormente (está nos meus favoritos), tanto que estou me baseando nele para tentar fazer o que preciso aqui. Estou fazendo um template aqui para equipe de controle de usuários, perfis, menus, e etc... para que eles possam usar nos próximos projetos.   Estava pensando e, o que você acha disso: na minha classe Usuario eu criar os métodos para buscar, inserir, atualizar e apagar e sobrescrever apenas os métodos da classe MembershipProvider que forem acionados (por exemplo, se for para ver se um usuário está autenticado, ou para ver se ele pertence a um determinado perfil - este eu sei que a RoleProvider deve fazer isso, e assim por diante)? Dependendo de como for essa situação com o método CreateUser, nem vale a pena fazer uso do controle CreateUserWizard, já que o trabalho que vou ter para fazer as demais coisas seria quase o mesmo que sem ele, ou estou enganado?     Quanto ao web.config, segue trecho dele abaixo:    <connectionStrings>
  <add name="ConexaoSQL" connectionString="Data Source=192.168.10.14;Initial Catalog=UBIKTemplate;Integrated Security=true" providerName="System.Data.SqlClient"/>
 </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.
        -->
    <roleManager enabled="true"
                 defaultProvider="PerfilProvider"
                 cacheRolesInCookie="true"
                 cookieName=".ASPROLES"
                 cookieTimeout="30"
                 cookiePath="/"
                 cookieRequireSSL="false"
                 cookieSlidingExpiration="true"
                 cookieProtection="All">
                 <providers>
                    <clear />
                    <add connectionStringName="ConexaoSQL"
                         applicationName="UBIK"
                         name="PerfilProvider"
                         type="UBIK.Library.BLL.Perfil" />
                 </providers>
    </roleManager>
  <membership defaultProvider="UsuarioProvider">
     <providers>
      <add connectionStringName="ConexaoSQL"
           minRequiredPasswordLength="3"
           minRequiredNonalphanumericCharacters="2"
           enablePasswordRetrieval="false"
           enablePasswordReset="true"
           requiresQuestionAndAnswer="false"
           passwordFormat="Hashed"
           applicationName="UBIK"
           name="UsuarioProvider"
           type="UBIK.Library.BLL.Usuario" />
     </providers>
    </membership>     Fico no aguardo. Obrigado!
Responder

Gostei + 0

20/05/2010

Fabio Mans

No seu WebConfig falta a Key que comentei, na verdade se eu fosse você não utilizaria o Membership, eu criar os meus próprios métodos, faria uma dll e distribuiria.

Fabio
Responder

Gostei + 0

21/05/2010

Carlos Nogueira

Entendo,   Eu havia decidido usar a Membership principalmente para tentar configurar o acesso as páginas conforme o perfil do usuário, como você mesmo ensinou no seu artigo (alias, bem bacana por sinal). E também pretendo fazer uso do Page_Load() de cada página para verificar se o usuário está autenticado ou não, por meio daquela propriedade User.Identity.IsAuthenticated (acho que isso também deve fazer parte do Membership, só não sei qual propriedade ou método que é acionado para isso).   Então, se eu entendi o seu último post, o mais adequado é eu desenvolver minha classe com meus próprios métodos e propriedades para solucionar um cadastro e autenticação de usuário no projeto (página de login), e para configurar no projeto se o usuário tem permissão a uma página através do seu perfil ou se está autenticado, faço uso do Membership?   Ou seria a segunda opção, seria mesmo fazer tudo isso a mão na minha classe Usuario? Neste último caso, em cada página ele teria que acionar um método da classe Usuario para verificar permissão na página e verificar se o mesmo está logado, não é?   Fico no aguardo. Obrigado!
Responder

Gostei + 0

21/05/2010

Fabio Mans

Assiste este meu curso

https://www.devmedia.com.br/articles/post-11713-Curso-Online-Forms-Authentication-e-Roles-Aula-I-Apresentando-o-objetivo-do-projeto.html

Ele é completo, eu falo tudo sobre Roles, Autenticação, permissão sem o Membership, que é o ideal se você tem as suas tabelas de usuários como é o seu caso, depois me diga o que acha.

Fabio


Responder

Gostei + 0

21/05/2010

Carlos Nogueira

Putz, show de bola Fabio!   Eu vou assistir aos vídeos e logo na sequência eu te falo! Valeu!
Responder

Gostei + 0

05/07/2010

Carlos Nogueira

Oi Fabio, bom dia!   Eu assisti ao seu curso, muito bom, me desculpe pelo atraso de responder somente agora pois as coisas estão numa correria que só aqui na empresa, e só agora que consegui retomar para o projeto (ou pelo menos assim espero, rs).   Gostaria de esclarecer algumas dúvidas com você do curso conforme o projeto que estou trabalhando. As dúvidas seguem abaixo:   1 -) No arquivo de configuração, para o elemento "authentication" caso queira definir a página url que ele irá redirecionar quando a autenticação obtiver sucesso, é o atributo "defaultUrl"?   2 -) Eu observei que as autorizações das pastas/páginas são feitas no arquivo web.config que se encontra na raiz do projeto. Neste projeto template que estou trabalhando, ele está dividido em duas áreas: frontend e backoffice. Inicialmente as páginas de cada área estarão em suas respectivas pastas, e para cada uma das áreas haverá uma página de login. Com isso segue algumas dúvidas deste item: 2.a -) Eu posso ter dois elementos authentication no meu arquivo de configuração ou, para cada pasta preciso criar um arquivo de configuração e setar o authentication de cada uma para informar quem será a página de login? 2.b -) Inicialmente fiz o controle de permissões (usando a tag "location") de página por página do projeto. O projeto pode aumentar conforme a necessidade (aumentar número de páginas). Você acredita que o mais coerente é restringir as permissões por página ou por pasta?   3 -) Eu observei que após usuário estar autenticado, você pode obter o nome do mesmo pela propriedade "User.Identity.Name". Se além do nome eu desejar resgatar todas as informações deste usuário que tenho no banco por meio do "User.Identity", eu consigo? Por exemplo, além do nome, eu desejo saber qual é o código dele no banco de dados, perfil, caso tenha informação de endereço também, e etc. Pergunto isso pois no exemplo não vi fazer uso do código do usuário e as vezes preciso obter essa e outras informações do usuário conforme funcionalidade da página.
Antes fazia do jeito que você mencionou no curso, usava uma Session, e atribuia para ela meu objeto Usuario, e a partir dai, tinha todas as informações do usuário nessa Session, para não ter que acessar o banco várias vezes.   Fico no aguardo. Obrigado!
Responder

Gostei + 0

05/07/2010

Carlos Nogueira

Mais uma dúvida: No meu projeto Web Application, tenho uma página do tipo "Web Content Form", onde consigo visualizar o "User.Identity" e ele utiliza uma master page do tipo "AJAX Master Page", porém nesta master page, não consigo encontrar o "User.Identity". Na master page, pretendo usar a informação do perfil para poder montar o menu para o usuário.
Será que tem algo na minha master page que está faltando, que eu esqueci de acrescentar?
Obrigado!
Responder

Gostei + 0

12/07/2010

Fabio Mans

Não tem como, somente na página .aspx.

Fabio
Responder

Gostei + 0

12/07/2010

Carlos Nogueira

Entendo.   O que você sugere conforme as opções abaixo:   1 - transformar minha classe Usuario em classe estática para que eu tenho acesso a todas as informações do usuário em qualquer parte do projeto;   2 - Após autenticar o usuário, atribuir a minha classe Usuario para uma Session para que tenho acesso a todas as informações do usuário pela Session em qualquer parte do projeto, e manter a autorização das páginas com o FormsAuthentication;
Responder

Gostei + 0

28/07/2010

Fabio Mans

Este chamado é sobre o mesmo assunto que estavamos conversando?
Responder

Gostei + 0

28/07/2010

Carlos Nogueira

Não não... No outro assunto é sobre problema de autorização, neste é sobre acesso aos demais dados do usuário (classe customizada) através do User.Identity.
Responder

Gostei + 0

28/07/2010

Fabio Mans

Então grava no cook de autenticação ao invés de Session

Por exemplo

No cook eu tenho a matricula e o perfil
Snippetprivate void CriaTicket(AutenticacaoViewModel viewModel)
    {
        string roles = string.Format(",", viewModel.Matricula.Trim(), viewModel.Perfil);
        FormsAuthenticationUtil.RedirectFromLoginPage(string.Format(" - ", viewModel.Colaborador.Trim(),viewModel.Perfil), roles, true);
    }


Para recuperar

Snippetpublic static class AcessoColaborador
    {

        /// <summary>
        /// 0 - Matricula / 1 - Perfil 
        /// </summary>
        /// <param name="posicao"></param>
        /// <returns></returns>
        public static string MatriculaPerfil(Posicao posicao)
        {

            string cookieName = FormsAuthentication.FormsCookieName;
            HttpCookie authCookie = HttpContext.Current.Request.Cookies.Get(cookieName); 
            string dados = string.Empty;
            FormsAuthenticationTicket authTicket = null;
            if (authCookie != null) authTicket = FormsAuthentication.Decrypt(authCookie.Value);
            if (authTicket != null)
            {
                string[] roles = authTicket.UserData.Split(new char[] { ',' });
                dados = roles[(int) posicao];
            }
            return dados;
        }
    }
}

public enum Posicao
{
    Matricula,
    Perfil,
    IdCentroCusto,
    CentroCusto
}


Quando eu quero pegar o id dele eu faço o seguinte (aspx)

SnippetSnippetint matricula = int.Parse(AcessoColaborador.MatriculaPerfil(Posicao.Matricula));

Não uso session, deixo no cook

Fabio





Responder

Gostei + 0

28/07/2010

Carlos Nogueira

Ok, eu vou modificar o que tenho para fazer do jeito que você sugeriu. Vi que você usa uma classe chamada FormsAuthenticationUtil, ainda não tinha visto ela mas já vi que tem um curso seu na DevMedia a respeito, vou estudar e implementar.   Se desejar, pode finalizar o chamado. Obrigado!
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar