2011-07-06 12 views
5

カスタムiprincpalとiidentityオブジェクトの実装が残っています。これらの権利をどのように実装し、より多くの情報でそれを拡張するかを検索するために、私は1日を過ごします。カスタムメンバーシップとロールプロバイダを使用してMVCでIPrincipalとIIdentityを実装する

情報@Context.User.Identity.Nameにフルネームなどのカスタム変数を追加したいと考えています。

EDIT:今、私は次のコードを得たが、私は@((CustomPrincipal)Context.User.Identity).Nachnameを読みしようとした場合、私はSystem.Web.Security.FormsIdentityCustomPrincipalにキャストすることができなかったというエラーを取得しています。

アイデア?

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; 
    } 
+0

の? –

+0

これらのオブジェクトがあることはわかりませんでした。それらを拡張する方法? – float

+0

それらを拡張(継承)する必要はないかもしれませんが、最も簡単な方法は、それぞれの新しいインスタンスを作成することです。http://msdn.microsoft.com/en-us/library/y9dd5fx0(v=VS) .100).aspx –

答えて

4

使用(CustomPrincipal)Context.User).Nachname代わりにGenericPrincipal&GenericIdentityクラスを拡張して、問題が何(CustomPrincipal)Context.User.Identity).Nachname

関連する問題