2015-08-12 12 views
9

Czy istnieje sposób, aby zastąpić HttpContext.Current.User.Identity, aby dodać inną właściwość (nazwę ekranu)?Czy można rozszerzyć właściwości HttpContext.Current.User.Identity

Moja aplikacja używa Identity i zostawiłem unikalną tożsamość jako wiadomość e-mail. Przechowuję dane użytkownika, takie jak imię/nazwisko w oddzielnej tabeli "Profile". Czy istnieje sposób na przechowywanie tych informacji gdzieś w obrębie HttpContext.Current?

To niekoniecznie musi być w zakresie User. Miałem przeszukanie i zauważyłem, że jest HttpContext.Current.ProfileBase. Nie wiem, jak tego użyć - i naprawdę nie chcę wszystkich nadmiarów, z których pochodzi baza.

+0

Jak rozumiem, masz inną tabelę z dodatkowymi danymi użytkownika. I chcesz pobrać dane bieżącego użytkownika. Czy mam rację? Czy korzystasz z Entity Framework? A w jaki sposób wolisz przechowywać te dane w innej tabeli? –

+0

"Użytkownik" to tak naprawdę tylko "IPrincipal", a "Tożsamość" to po prostu "IIdentity". Możesz łatwo stworzyć własną implementację 'User' z własną implementacją' Identity'. Muszą tylko przestrzegać interfejsów. – TyCobb

+0

Od kiedy używasz Asp.Net Identity, sposobem na to jest Roszczenie. Zobacz moją odpowiedź zamieszczoną poniżej. –

Odpowiedz

17

Jeśli używasz Asp.Net tożsamość, to jest bardzo łatwe do zrobienia z roszczeniami.

W swojej metodzie SignInAsync (lub gdziekolwiek jesteś tworzeniu tożsamości roszczeń), dodać typy wniosków GivenName i Surname:

private async Task SignInAsync(ApplicationUser user, bool isPersistent) 
{ 
    AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie); 

    var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie); 

    // Add the users primary identity details to the set of claims. 
    var your_profile = GetFromYourProfileTable(); 

    identity.AddClaim(new Claim(ClaimTypes.GivenName, your_profile == null ? string.Empty : your_profile.FirstName)); 
    identity.AddClaim(new Claim(ClaimTypes.Surname, your_profile == null ? string.Empty : your_profile.LastName)); 

    AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity); 
} 

wtedy użyć metodę rozszerzenia do IIdentity wyciągnąć informacje out of the roszczenia tożsamość:

public static ProfileName GetIdentityName(this IIdentity identity) 
{ 
    if (identity == null) 
     return null; 

    var first = (identity as ClaimsIdentity).FirstOrNull(ClaimTypes.GivenName), 
    var last = (identity as ClaimsIdentity).FirstOrNull(ClaimTypes.Surname) 

    return string.Format("{0} {1}", first, last).Trim(); 
} 

internal static string FirstOrNull(this ClaimsIdentity identity, string claimType) 
{ 
    var val = identity.FindFirst(claimType); 

    return val == null ? null : val.Value; 
} 

Następnie w aplikacji (w kontroler lub widoku), można po prostu zrobić:

var name = User.Identity.GetIdentityName(); 
+0

Czy można zastąpić własność 'Name'? –

+0

@ErwinRooijakkers własność 'Name' czego? Czy możesz podać więcej szczegółów? –

+0

'HttpContext.Current.User.Identity.Name'. Zobacz także [to pytanie zadałem] (http://stackoverflow.com/questions/32336360/override-httpcontext-current-user-identity-name/32341483#32341483). –

0

znalazłem jedną realizacji:

var profile = db.UserProfile.Where(u => u.UserId == user.Id).FirstOrDefault(); 
ProfileBase httpProfile = ProfileBase.Create(user.UserName); 
httpProfile.SetPropertyValue("FullName", profile.FullName); 
httpProfile.SetPropertyValue("FirstName", profile.FirstName); 
httpProfile.SetPropertyValue("LastName", profile.LastName); 

Następnie, aby uzyskać później ...

ProfileBase userProfile = ProfileBase.Create(HttpContext.User.Identity.Name); 
var fullName = userProfile.GetPropertyValue("FullName")); 
0

Absolutnie! Musisz utworzyć własny typ, który implementuje od IPrincipal i samodzielnie przejąć zabezpieczenia. Możesz uwierzytelnić użytkownika w kroku OWIN, ręcznie ustawiając context.Request.User.

3

Możesz umieścić wartość w HttpContext.Current.Items. Jest to słownik, którego okres istnienia jest pojedynczym żądaniem.

Można go używać tak:

public static string CurrentScreenName 
{ 
    get 
    { 
     string screenName = (string)HttpContext.Current.Items["CurrentScreenName"]; 

     if (string.NullOrEmpty(screenName)) 
     { 
      screenName = ResolveScreenName(); 
      HttpContext.Current.Items["CurrentScreenName"] = screenName; 
     } 
     return screenName; 
    } 
} 

To będzie wykonywał ResolveScreenName() tylko raz na jedno żądanie.

Ponadto można dokonać metodę rozszerzenia dostępu do pseudonimu z IIdentity

public static class Extensions 
{ 
    public static string GetScreenName(this IIdentity identity) 
    { 
     return CurrentScreenName; 
    } 
} 

a następnie używać go tak:

string screenName = HttpContext.Current.User.Identity.GetScreenName(); 
Powiązane problemy