SORU
30 HAZİRAN 2009, Salı


ASP.NET MVC - Set İİdentity özel veya Kullanıcı

Oldukça basit bir şey yapmak istiyorum: ASP.NET MVC benim uygulamada, bir özel İİdentity / Kullanıcı. ayarlamak istiyorum Daha kolay / daha uygun hangisi. User.Identity.Id User.Identity.Role gibi bir şey diyebilirim varsayılan genişletmek istiyorum. Abartacak bir şey yok, bazı ekstra özellikleri sadece.

Makaleler ton ve soruları okudum ama bunu olduğundan daha zor hale gibi hissediyorum. Kolay olacağını düşündüm. Eğer bir kullanıcı oturum açtığında, özel bir İİdentity ayarlamak istiyorum. Ben de düşündüm ki, benim genel Application_PostAuthenticateRequest uygulamak.asax. Ancak, adı her istek, ve ben yapmak istemiyor araması için veritabanında her isteği olan talep tüm veri tabanı ve bir Kullanıcı özel bir nesne. Bu da çok gereksiz, yavaş ve yanlış yerde (veritabanı arama yapıyor) gibi görünüyor ama yanılıyor olabilirim. Ya da başka nerede bu veri nereden gelecek?

Bir kullanıcı günlükleri her zaman düşündüm, bu yüzden, özel Application_PostAuthenticateRequest olay işleyicisi İİdentity ekliyorum benim oturumunda gereken bazı değişkenler ekleyebilirsiniz. Ancak, benim Context.Session de gitmek için yol değildir null var.

Bir gün için şu an bunun üzerinde çalışıyorum ve ben bir şey eksik hissediyorum. Bu çok da zor olmamalı değil mi? Biraz da bu gelir (yarı)tüm ilgili şeyler kafamı karıştırdı. MembershipProvider, **, RoleProvider, ProfileProvider, IPrincipal, , *.IIdentity*25 20... Tüm bu kafa karıştırıcı çok bulan bir tek ben miyim?

Eğer birisi bana fazladan belirsizlik olmadan bir İİdentity ekstra veri depolamak için basit, şık ve etkili bir çözüm söyler misiniz, bu harika olurdu! Ama eğer ihtiyacım var cevap yok ise, Gözden kaçırmış olmalıyım ÇOK benzer sorular var biliyorum. Teşekkürler.

CEVAP
9 Mayıs 2012, ÇARŞAMBA


Bunu nasıl burada.

Hem İİdentity ve Kullanıcı uygulamaya gerek yok demektir çünkü İİdentity yerine Kullanıcı kullanmaya karar verdim.

  1. Arabirimi oluşturmak

    interface ICustomPrincipal : IPrincipal
    {
        int Id { get; set; }
        string FirstName { get; set; }
        string LastName { get; set; }
    }
    
  2. CustomPrincipal

    public class CustomPrincipal : ICustomPrincipal
    {
        public IIdentity Identity { get; private set; }
        public bool IsInRole(string role) { return false; }
    
        public CustomPrincipal(string email)
        {
            this.Identity = new GenericIdentity(email);
        }
    
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
    
  3. CustomPrincipalSerializeModel - FormsAuthenticationTicket nesne kalıcı kullanıcı verileri alana özel bilgileri seri hale getirilirken için.

    public class CustomPrincipalSerializeModel
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
    
  4. Giriş yöntemi - kurabiye kurma özel bilgi

    if (Membership.ValidateUser(viewModel.Email, viewModel.Password))
    {
        var user = userRepository.Users.Where(u => u.Email == viewModel.Email).First();
    
        CustomPrincipalSerializeModel serializeModel = new CustomPrincipalSerializeModel();
        serializeModel.Id = user.Id;
        serializeModel.FirstName = user.FirstName;
        serializeModel.LastName = user.LastName;
    
        JavaScriptSerializer serializer = new JavaScriptSerializer();
    
        string userData = serializer.Serialize(serializeModel);
    
        FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
                 1,
                 viewModel.Email,
                 DateTime.Now,
                 DateTime.Now.AddMinutes(15),
                 false,
                 userData);
    
        string encTicket = FormsAuthentication.Encrypt(authTicket);
        HttpCookie faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);
        Response.Cookies.Add(faCookie);
    
        return RedirectToAction("Index", "Home");
    }
    
  5. Global.asax.cs - Okuma kurabiye ve yerine HttpContext.Kullanıcı nesnesi, bu geçersiz kılma PostAuthenticateRequest tarafından yapılır

    protected void Application_PostAuthenticateRequest(Object sender, EventArgs e)
    {
        HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
    
        if (authCookie != null)
        {
            FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
    
            JavaScriptSerializer serializer = new JavaScriptSerializer();
    
            CustomPrincipalSerializeModel serializeModel = serializer.Deserialize<CustomPrincipalSerializeModel>(authTicket.UserData);
    
            CustomPrincipal newUser = new CustomPrincipal(authTicket.Name);
            newUser.Id = serializeModel.Id;
            newUser.FirstName = serializeModel.FirstName;
            newUser.LastName = serializeModel.LastName;
    
            HttpContext.Current.User = newUser;
        }
    }
    
  6. Jilet görünümlerde erişim

    @((User as CustomPrincipal).Id)
    @((User as CustomPrincipal).FirstName)
    @((User as CustomPrincipal).LastName)
    

ve kodu:

    (User as CustomPrincipal).Id
    (User as CustomPrincipal).FirstName
    (User as CustomPrincipal).LastName

Kodu kendi kendini açıklayıcı olduğunu düşünüyorum. Yok, bana bildirin değil.

Ayrıca erişim daha da kolay hale getirmek için temel bir denetleyicisi oluşturmak ve iade Kullanıcı (HttpContext.nesne geçersiz kılabilirsiniz Kullanıcı):

public class BaseController : Controller
{
    protected virtual new CustomPrincipal User
    {
        get { return HttpContext.User as CustomPrincipal; }
    }
}

ve, her denetleyici için:

public class AccountController : BaseController
{
    // ...
}

seni böyle: kod içinde özel alanlara erişim sağlayacak

User.Id
User.FirstName
User.LastName

Ama bu görüş içinde çalışmaz. Bunun için özel WebViewPage bir uygulama oluşturmak için ihtiyacınız olacak:

public abstract class BaseViewPage : WebViewPage
{
    public virtual new CustomPrincipal User
    {
        get { return base.User as CustomPrincipal; }
    }
}

public abstract class BaseViewPage<TModel> : WebViewPage<TModel>
{
    public virtual new CustomPrincipal User
    {
        get { return base.User as CustomPrincipal; }
    }
}

Bu Görünümlerde varsayılan sayfa türü/web olun.config:

<pages pageBaseType="Your.Namespace.BaseViewPage">
  <namespaces>
    <add namespace="System.Web.Mvc" />
    <add namespace="System.Web.Mvc.Ajax" />
    <add namespace="System.Web.Mvc.Html" />
    <add namespace="System.Web.Routing" />
  </namespaces>
</pages>

ve görüşlerini şu şekilde erişebilirsiniz:

@User.FirstName
@User.LastName

HTH

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DorkmanScott

    DorkmanScott

    14 NİSAN 2006
  • katherine gomez

    katherine go

    1 Aralık 2011
  • michal lelkowski

    michal lelko

    9 Temmuz 2006