none
Como controlar os dados do usuário na aplicação? RRS feed

  • Pergunta

  • Customizei o controle de usuários e agora me deparo com uma grande dúvida.
    Como gerenciar os dados do usuário ???

    Na aplicação tenho MasterPage, View, UserControls, Controllers, Model, etc.
    Como ter os dados do usuário em todos locais sem ter que refazer consulta ou usar session??

    Atualmente todos meus controllers são herdados de um controller base. Nele tenho uma variável usuário que é uma classe herdada de IPrincipal, no qual tenho as informações do IPrincipal mais dados que preciso ter em determinados momentos.

    No Initialize do ControllerBase faço acesso ao banco e pego as informações usando o "HttpContext.Profile.UserName". Para ler estes dados nos outros lugares, coloco no TempData e leio ... mas não gostei desse jeito.

    Que vcs sugerem para resolver este problema ???

    Tenho classes para MasterPage, UserControl, ViewPage, Controller. Em todas tenho uma propriedade usuário que uso nas situações que preciso. Como compartilhar estes dados ??

    Grato
    quinta-feira, 15 de outubro de 2009 22:37

Respostas

Todas as Respostas

  • Ricardo,

    Se você precisa somente do nome do usuário (o nome que ele usa para autenticar na sua aplicação) você pode recupera-lo da seguinte forma:

    Na view:
    Page.User.Identity.Name

    No Controller:
    User.Identity.Name

    Este name é o name que você passa para o método SignIn ao autenticar o usuário. Ex:

    FormsAuth.SignIn(userName, rememberMe);


    Não sei se você pode passar um nome mais amigavél para este método, mas acredito que funcione.

    Agora se você deseja ter mais informações do usuário aconselho o uso de um Profile Provider, você pode usar o do Sql (http://msdn.microsoft.com/en-us/library/014bec1k.aspx) ou criar o seu próprio, veja os links abaixo:

    http://msdn.microsoft.com/en-us/library/ta63b872.aspx
    http://msdn.microsoft.com/en-us/magazine/cc163457.aspx
    http://www.asp.net/learn/videos/video-190.aspx

    Espero ter ajudado. Qualquer dúvida favor entrar em contato.

    Douglas Aguiar
    MCAD, MCT

    • Sugerido como Resposta Douglas Aguiar sexta-feira, 16 de outubro de 2009 02:43
    sexta-feira, 16 de outubro de 2009 02:43
  • Duglas,

    De fato poderia utilizar o Page.User.Identity.Name, porém quero mais informações para realizar algumas operações. Tipo: Saber se é administrador, login, e-mail, avatar, etc. Para estes dados criei uma classe herdade de MembershipUser. Então, após logar, meu MemberShip preenche esta classe com todas informações que preciso.


    Como falei antes não quero ficar fazendo consulta a banco todo request ou a cada carregamento de componente (controller, usercontrol, viewpage, masterpage) ... da forma que montei agora faço uma por request, mas ainda não acho isso bom.

    Sobre o Profile:
    No web.config raiz, tenho o seguinte:

    <profile defaultProvider="RRProfileProvider">
          <providers>
            <clear/>
            <add name="RRProfileProvider"
                 type="RR.Autenticacao.Web.Perfil.EFProfileProvider"
                 connectionStringName="RRAutenticacaoX"
                 applicationName="Pok" />
          </providers>
          <properties>
            <add name="Login" type="string" allowAnonymous="false" />
            <add name="Email" type="string" allowAnonymous="false" />
            <add name="Codigo" type="Guid" allowAnonymous="true" />
            <add name="ClasseUsuario" type="RR.Autenticacao.Web.Seguranca.RRMembershipUser" serializeAs="Binary" allowAnonymous="false" />
          </properties>
        </profile>

    Onde "RR.Autenticacao.Web.Perfil.EFProfileProvider" é uma classe que herda de "ProfileProvider" e é serializável.


    No meu controller, digito "HttpContext.Profile" e tenho acesso ao Profile, porém as propriedades que listei acima, no web.config, não aparecem. Vc saberia dizer o porquê delas não estarem aparecendo automaticamente como é normalmente mostrado nos exemplos da web.


    Este exemplo http://msdn.microsoft.com/en-us/library/d8b58y5d.aspx é um que mostra as propriedades adicionadas no web.config diretas no Profile.


    Sabe dizer aonde está meu erro ???
    sexta-feira, 16 de outubro de 2009 11:48
  • Ricardo,

    Você tem que criar uma classe que herde da classe ProfileBase com estas propriedades que você configurou no profile e fazer a seguinte modificação no seu Web.config:

    <profile enabled="true" inherits="MinhaClasseQueHerdaDeProfileBase" defaultProvider="RRProfileProvider">

    Daí você passará a acessar as propriedades como nos exemplos que você viu pela web, estas propriedades que você declarou no Web.config não são suportadas pelo MVC.

    Exemplo de uma classe que herda de ProfileBase:

    using System;
    using System.Web.Profile;
    
    namespace Samples.AspNet.Profile
    {
      public class EmployeeProfile : ProfileBase
      {
        [SettingsAllowAnonymous(false)]
        [ProfileProvider("EmployeeInfoProvider")]
        public string Department
        {
          get { return base["EmployeeDepartment"].ToString(); }
          set { base["EmployeeDepartment"] = value; }
        }
    
        [SettingsAllowAnonymous(false)]
        [ProfileProvider("EmployeeInfoProvider")]
        public EmployeeInfo Details
        {
          get { return (EmployeeInfo)base["EmployeeInfo"]; }
          set { base["EmployeeInfo"] = value; }
        }
      }
    }

    Veja mais sobre o ProfileBase nestes links:

    http://joyofexcellence.com/blog/index.php/2009/05/17/profileprovider-in-an-mvc-world/ - Otimo!

    http://msdn.microsoft.com/en-us/library/system.web.profile.profilebase(VS.80).aspx
    http://stackoverflow.com/questions/834166/implementing-custom-profile-provider-in-asp-net-mvc

    Espero ter ajudado. Qualquer dúvida favor entrar em contato.

    Douglas Aguiar
    MCAD, MCT

    sexta-feira, 16 de outubro de 2009 13:34
  • Douglas,


    Primeiramente, obrigado pela resposta acima, ela resolveu o problema proposto.

    Realmente consegui fazer com que os dados de profile sejam gravados na tabela, mas tenho tido alguns problemas em relação a ele. Acredito que devam ser até banais, porém sua ajuda é de grande valia.


    Peguei como base um projeto do Codeplex que customiza todo membership para ser utilizado com o Entity.  Alterei de acordo com minhas necessidades e inicialmente o problema é apenas com o profile. (Acredito ser problema na forma de utilizar e não no código).

    Uso login tipo "forms".
    Quando o usuário loga no site, o FormAuth é setado. E isso funciona sem problemas, mas em que momento o profile deve ser criado ???
    Achei exemplos que fazem implementam um método "GetProfile" e ele usa um create.

    public virtual ProfileCommon GetProfile(string username)       
    {           
         return Create(username) as ProfileCommon;     
    }

    Esta é a forma correta de usar ??
    O profile vai sempre acessar o banco ou ele guarda alguns dados em sessão ???

    Grato


    Ricardo
    segunda-feira, 19 de outubro de 2009 15:13
  • Ricardo,

    Esta é a forma correta de usar sim.

    O profile vai ao banco apenas uma vez para recuperar os valores, e segundo este artigo (http://msdn.microsoft.com/en-us/library/system.web.profile.profilebase.save.aspx) da documentação da microsoft ele até ajuda a reduzir as idas ao banco.

    "The profile provider can reduce the amount of activity at the data source" - retirado do Remarks deste artigo.

    Espero ter ajudado. Qualquer dúvida favor entrar em contato.

    Douglas Aguiar
    MCAD, MCT

    • Sugerido como Resposta Douglas Aguiar segunda-feira, 19 de outubro de 2009 21:55
    segunda-feira, 19 de outubro de 2009 21:55