2015-08-12 16 views
9

Başka bir özellik eklemek için HttpContext.Current.User.Identity geçersiz kılmanın bir yolu var mı (ekran adı)?HttpContext.Current.User.Identity özelliklerini genişletir

Uygulamam Identity kullanıyor ve benzersiz kimliği e-posta olarak bıraktım. İlk/son isim gibi kullanıcı verilerini ayrı bir "Profile" tablosunda saklıyorum. Bu bilgiyi HttpContext.Current içinde bir yerde saklamanın bir yolu var mı?

User'un içinde olması gerekmez. Bir arama yaptım ve bir HttpContext.Current.ProfileBase olduğunu fark ettim. Bunu nasıl kullanacağından emin değilim - ve üssü olan tüm fazlalık şeyleri gerçekten istemiyorum.

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); 

Sonra sonradan almak için ...

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

Anladığım kadarıyla ek kullanıcı verilerine sahip farklı tablonuz var. Ve mevcut kullanıcının verilerini almak istiyorsun. Ben haklı mıyım Entity Framework kullanıyor musunuz? Ve bu verileri başka bir tabloya kaydetmeyi tercih edersiniz? –

+0

'User' gerçekten sadece bir“ IPrincipal ”ve“ Identity ”sadece“ IIdentity ”dir. Kendi kimliğinizin 'Identity' uygulamasıyla kendi uygulamanızı kolayca oluşturabilirsiniz. Sadece arayüzlere bağlı kalmaları gerekiyor. – TyCobb

+0

Asp.Net Identity'yi kullandığınızdan, bununla ilgili yöntem Hak Talepleri'dir. Aşağıda benim yanıtımı gör. –

cevap

17

, o zaman bu çok geçerli:

Ayrıca IIdentity

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

ekran adı erişmek Ve sonra bu gibi kullanmak için uzatma yöntemi yapabilir iddiaları ile kolay. (Eğer iddialar kimliğini oluştururken her yerde ya,) sizin SignInAsync yöntemde

, GivenName ve Surname iddia türleri eklemek:

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); 
} 

Daha sonra dışarı bilgi çekmesi IIdentity bir uzantı yöntemini kullanmak iddialar kimlik:

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

Ardından, uygulamada (denetleyicisi veya görünümünde), tıpkı senin yapabilirsiniz:

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

kabul edecek 'Name' özelliğini geçersiz kılmak mümkün mü? –

+0

@ErwinRooijakkers neyin 'Name' özelliği nedir? Biraz daha detay verebilir misin? –

+0

'HttpContext.Current.User.Identity.Name'. Ayrıca [bu soruyu sordum] bölümüne bakın (http://stackoverflow.com/questions/32336360/override-httpcontext-current-user-identity-name/32341483#32341483). –

0

Bir uygulama buldum! IPrincipal'dan gelen kendi türünüzü oluşturmanız ve güvenliği kendiniz üstlenmeniz gerekir. Kullanıcıyı bir OWIN adımında, context.Request.User'u manuel olarak ayarlayarak doğrulayabilirsiniz.

0

Kesinlikle:

3

HttpContext.Current.Items'e değer ekleyebilirsiniz. Bu, ömür boyu tek talep olan sözlüktür.

Böyle kullanabilirsiniz:

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

Tek isteği için sadece bir kez) ResolveScreenName (çalıştırır. Eğer Asp.Net Kimlik kullanıyorsanız

string screenName = HttpContext.Current.User.Identity.GetScreenName(); 
İlgili konular