यहाँ है कि मैं यह कैसे करते हैं।
मैंने IIdentity के बजाय IPrincipal का उपयोग करने का निर्णय लिया क्योंकि इसका मतलब है कि मुझे IIdentity और IPrincipal दोनों को लागू करने की आवश्यकता नहीं है।
इंटरफ़ेस बनाएँ
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 - FormsAuthentication.nic ऑब्जेक्ट में userdata फ़ील्ड में कस्टम जानकारी को क्रमांकित करने के लिए।
public class CustomPrincipalSerializeModel
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
लॉग इन विधि - कस्टम जानकारी के साथ एक कुकी की स्थापना
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 - कुकी पढ़ना और HttpContext.User ऑब्जेक्ट को बदलना, यह PostAuthenticateRequest को ओवरराइड करके किया जाता है
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;
}
}
रेजर विचारों में प्रवेश
@((User as CustomPrincipal).Id)
@((User as CustomPrincipal).FirstName)
@((User as CustomPrincipal).LastName)
और कोड में:
(User as CustomPrincipal).Id
(User as CustomPrincipal).FirstName
(User as CustomPrincipal).LastName
मुझे लगता है कि कोड आत्म-व्याख्यात्मक है। यदि ऐसा नहीं है, तो मुझे बताएं।
इसके अतिरिक्त पहुँच को और भी आसान बनाने के लिए आप एक बेस कंट्रोलर बना सकते हैं और लौटाए गए उपयोगकर्ता ऑब्जेक्ट को ओवरराइड कर सकते हैं (HttpContext.serser):
public class BaseController : Controller
{
protected virtual new CustomPrincipal User
{
get { return HttpContext.User as CustomPrincipal; }
}
}
और फिर, प्रत्येक नियंत्रक के लिए:
public class AccountController : BaseController
{
// ...
}
जो आपको इस तरह से कोड में कस्टम फ़ील्ड का उपयोग करने की अनुमति देगा:
User.Id
User.FirstName
User.LastName
लेकिन यह विचारों के अंदर काम नहीं करेगा। इसके लिए आपको एक कस्टम वेब व्यूपेज कार्यान्वयन बनाने की आवश्यकता होगी:
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; }
}
}
इसे दृश्य / web.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>
और विचारों में, आप इसे इस तरह एक्सेस कर सकते हैं:
@User.FirstName
@User.LastName