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
Bunu nasıl burada.
Hem İİdentity ve Kullanıcı uygulamaya gerek yok demektir çünkü İİdentity yerine Kullanıcı kullanmaya karar verdim.
Arabirimi oluÅŸturmak
interface ICustomPrincipal : IPrincipal { int Id { get; set; } string FirstName { get; set; } string LastName { get; set; } }
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; } }
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; } }
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"); }
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; } }
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
Reset veya özel sürüm kullanmaya Gah i...
Nasıl özel yöntemleri, alanları veya i...
Özel SSH-key veya Ruby olmadan kabuk k...
Django özel alanları ile uzanan Kullan...
Farklı Windows bağlanmak SQL Server Ma...