2016-04-08 14 views
2

Kimlik API'sı tarafından oluşturulan çerez içindeki kullanıcıdan bazı özel verileri depolamanın bir yolu var mı?Özel verileri Kimlik Çerezinde saklama

Çok kiracı bir uygulama oluşturuyoruz ve bu nedenle birden çok şirket, uygulamanızın aynı örneğine erişebilir. Bu yüzden, belirli bir kullanıcı için, tarayıcıyı kapattıktan sonra web uygulamasında geri döndüğünde kullanıcıdan verileri almak için şirket kodunun kullanıcı tarafından kimlik tanımlama bilgisinde saklanması gerekir.

cevap

12

Özel bir UserClaimsPrincipalFactory uygulayıp mağaza numaranız için özel bir talep ekleyerek bunu diğer hak talepleriyle birlikte çerezde saklayabilirsiniz. Benim senaryo o kadar özel fabrika kaydetmeniz gerekir

Startup Sonra
using cloudscribe.Core.Models; 
using Microsoft.AspNet.Identity; 
using Microsoft.Extensions.OptionsModel; 
using System; 
using System.Security.Claims; 
using System.Threading; 
using System.Threading.Tasks; 

namespace cloudscribe.Core.Identity 
{ 
    public class SiteUserClaimsPrincipalFactory<TUser, TRole> : UserClaimsPrincipalFactory<TUser, TRole> 
    where TUser : SiteUser 
    where TRole : SiteRole 
{ 
    public SiteUserClaimsPrincipalFactory(
     ISiteRepository siteRepository, 
     SiteUserManager<TUser> userManager, 
     SiteRoleManager<TRole> roleManager, 
     IOptions<IdentityOptions> optionsAccessor) : base(userManager, roleManager, optionsAccessor) 
    { 
     if (siteRepository == null) { throw new ArgumentNullException(nameof(siteRepository)); } 

     siteRepo = siteRepository; 
     options = optionsAccessor.Value; 
    } 

    private ISiteRepository siteRepo; 
    private IdentityOptions options; 

    public override async Task<ClaimsPrincipal> CreateAsync(TUser user) 
    { 
     if (user == null) 
     { 
      throw new ArgumentNullException("user"); 
     } 

     var userId = await UserManager.GetUserIdAsync(user); 
     var userName = await UserManager.GetUserNameAsync(user); 

     var id = new ClaimsIdentity(
      options.Cookies.ApplicationCookie.AuthenticationScheme, 
      Options.ClaimsIdentity.UserNameClaimType, 
      Options.ClaimsIdentity.RoleClaimType 
      ); 

      id.AddClaim(new Claim(Options.ClaimsIdentity.UserIdClaimType, userId)); 
      id.AddClaim(new Claim(Options.ClaimsIdentity.UserNameClaimType, userName)); 

      if (UserManager.SupportsUserSecurityStamp) 
      { 
       id.AddClaim(new Claim(Options.ClaimsIdentity.SecurityStampClaimType, 
       await UserManager.GetSecurityStampAsync(user))); 
      } 

      if (UserManager.SupportsUserRole) 
      { 
       var roles = await UserManager.GetRolesAsync(user); 
       foreach (var roleName in roles) 
       { 
        id.AddClaim(new Claim(Options.ClaimsIdentity.RoleClaimType, roleName)); 
        if (RoleManager.SupportsRoleClaims) 
        { 
         var role = await RoleManager.FindByNameAsync(roleName); 
         if (role != null) 
         { 
          id.AddClaims(await RoleManager.GetClaimsAsync(role)); 
         } 
        } 
       } 
      } 
      if (UserManager.SupportsUserClaim) 
      { 
       id.AddClaims(await UserManager.GetClaimsAsync(user)); 
      } 

      ClaimsPrincipal principal = new ClaimsPrincipal(id); 

      if (principal.Identity is ClaimsIdentity) 
      { 
       ClaimsIdentity identity = (ClaimsIdentity)principal.Identity; 

       Claim displayNameClaim = new Claim("DisplayName", user.DisplayName); 
       if (!identity.HasClaim(displayNameClaim.Type, displayNameClaim.Value)) 
       { 
        identity.AddClaim(displayNameClaim); 
       } 

       Claim emailClaim = new Claim(ClaimTypes.Email, user.Email); 
       if (!identity.HasClaim(emailClaim.Type, emailClaim.Value)) 
       { 
        identity.AddClaim(emailClaim); 
       } 

       ISiteSettings site = await siteRepo.Fetch(user.SiteId, CancellationToken.None); 

       if (site != null) 
       { 
        Claim siteGuidClaim = new Claim("SiteGuid", site.SiteGuid.ToString()); 
        if (!identity.HasClaim(siteGuidClaim.Type, siteGuidClaim.Value)) 
        { 
         identity.AddClaim(siteGuidClaim); 
        } 

       }  

      } 

      return principal; 

     } 
    } 
} 

çok kiracı da çünkü Aşağıda

Bir SiteGuid dahil olmak üzere birçok özel talepler ekliyorum projemden örnek kodudur enjekte ve bir

services.AddScoped<IUserClaimsPrincipalFactory<SiteUser>, SiteUserClaimsPrincipalFactory<SiteUser, SiteRole>>(); 

başka yaklaşım, ancak bu yaklaşım bir çereze ekstra iddialarını saklamaz ancak bunun yerine güncelleme Hasar Dönüşüm kullanmaktır varsayılan yerine kullanılan alır Her istek için hak talepleri, yani isteğin ömrü boyunca çerezden gelenlere daha fazla iddialar getirir, ancak tanımlamadaki iddiaları değiştirmez. startup.cs sonra

public class ClaimsTransformer : IClaimsTransformer 
{ 
    public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal) 
    { 
     ((ClaimsIdentity)principal.Identity).AddClaim(new Claim("ProjectReader", "true")); 
     return Task.FromResult(principal); 
    } 
} 

:

app.UseClaimsTransformation(new ClaimsTransformationOptions 
{ 
    Transformer = new ClaimsTransformer() 
}); 
+0

teşekkürler işe yaradı! UserClaimsPrincipalFactory ile ilgili her şeyi atladım çünkü kullanımımız için çok karmaşık ve sadece oturum açmak için ihtiyacım olduğunda HttpContext'i kullanıyorum. İki tane daha talepte bulundum ve başvurumun ikinci kullanımıyla ilgili bilgileri kurtarabilirim! :) –

+0

Joe, bu yöntemi kullanarak, cookie'lerin çerezlerinin "SiteGuid" i başka bir şeye düzenleyen kötü niyetli bir kullanıcı gibi kurcalanabilir mi? Geçerli bir Guid verileceğini tahmin etmek zor olurdu, ancak kullanıcının verilere erişimini filtrelemek için basit AccountId'leri (DB'deki anahtar değerleri) kullanmayı düşünüyorum. Bu güvenli mi? –

+0

Microsoft'un, kimlik doğrulama çerezinde saklanan rolleri ve hak taleplerini şifrelemek için dataprotection API kullandığını düşünüyorum. –

İlgili konular