使用自定义成员资格和角色提供程序在MVC中实现IPrincipal和IIdentity

我坚持使用自定义iprincpal和iidentity对象的实现。 我现在花了一天时间来搜索如何实现这些权利并用更多信息扩展它。

我想用自定义变量(如全名或其他)扩展Information @Context.User.Identity.Name

编辑 :现在我得到以下代码,但如果我尝试阅读@((CustomPrincipal)Context.User.Identity).Nachname我收到一个错误, System.Web.Security.FormsIdentity无法转换为CustomPrincipal

有任何想法吗?

 public class CustomPrincipal : GenericPrincipal { public CustomPrincipal(IIdentity identity, String[] roles) : base(identity, roles){ } public String Vorname { get; set; } public String Nachname { get; set; } } 

AccountModel:

 public class FormsAuthenticationService : IFormsAuthenticationService { public void SignIn(string userName, bool createPersistentCookie) { if (String.IsNullOrEmpty(userName)) throw new ArgumentException("Der Wert darf nicht NULL oder leer sein.", "userName"); // Grab user information to insert KIMembershipUser membershipUser = (KIMembershipUser)Membership.GetUser(userName); var customInfo = String.Format("{0}|{1}", membershipUser.Vorname, membershipUser.Nachname); // Create and encrypt the ticket var ticket = new FormsAuthenticationTicket( 2, // Version number userName, // Username DateTime.Now, // Issue date DateTime.Now.AddMinutes(30), // Expiration date createPersistentCookie, // Is it persistent? customInfo // User data ); var encTicket = FormsAuthentication.Encrypt(ticket); // Store the ticket into a cookie var cookie = FormsAuthentication.GetAuthCookie(FormsAuthentication.FormsCookieName,createPersistentCookie); cookie.Value = encTicket; // Append the cookie to the response HttpContext.Current.Response.Cookies.Add(cookie); //FormsAuthentication.SetAuthCookie(userName, createPersistentCookie); } public void SignOut() { FormsAuthentication.SignOut(); } } 

Global.asax中:

  protected void Application_PostAuthenticateRequest(){ // Collect current security information var principal = HttpContext.Current.User as RolePrincipal; if (principal == null) return; var identity = principal.Identity as FormsIdentity; if (identity == null) return; var roles = principal.GetRoles(); // Extract user data in the authentication ticket var customInfo = identity.Ticket.UserData; var tokens = customInfo.Split('|'); // Build a richer principal object var CustomPrincipal = new CustomPrincipal(identity, roles){ Vorname = tokens[0], Nachname = tokens[1] }; // Store the new principal in the HttpContext HttpContext.Current.User = CustomPrincipal; } 

使用(CustomPrincipal)Context.User).Nachname而不是(CustomPrincipal)Context.User.Identity).Nachname