SORU
23 EKİM 2013, ÇARŞAMBA


Microsoft kimlik türünü değiştirmek için.AspNet.Kimlik.EntityFramework.İdentityUser

(ASP.NET MVC 5, EF6, VS2013)

Nasıl olduğunu anlamaya çalışıyorumdeğişim türü "İd" int, string alantürü:

Microsoft.AspNet.Identity.EntityFramework.IdentityUser

yeni kullanıcı hesapları bir GUID yerine, bir tamsayı KİMLİĞİ ile ilişkili olduğu için. Ama bu sadece türetilmiş benim kullanıcı sınıfta int ile yeni bir Kimlik özelliği ekleyerek daha karmaşık olacak gibi görünüyor. Bu yöntem, imza: bir göz atın

(Derleme Microsoft.AspNet.Identity.Core.dll dan)

public class UserManager<TUser> : IDisposable where TUser : global::Microsoft.AspNet.Identity.IUser
  {
  ...
  public virtual Task<IdentityResult> AddLoginAsync(string userId, UserLoginInfo login);
  ...
  }

Diğer yöntemler kullanıcı kimliği bir dize gerektirir ASP.NET kimlik çerçevesi içine pişmiş var gibi görünüyor. Bu sınıflar da yeniden gerçeklemek gerekir?

Kullanıcı tabloda kimlikleri için GUID saklamak istemiyorum neden bir açıklama:

-Yabancı bir tuşu ile kullanıcıların tabloya veri ile ilgili diğer tablolar olacak. (Kullanıcı, site içeriği kaydedin.) Daha büyük alana kullanımı ve net bir avantaj ekstra veritabanı alanı harcamak için hiç bir neden göremiyorum. (GUID vs int kimlikleri kullanma hakkında başka mesajlar olduğunu biliyorum, ama yine de beni merak bırakır int kimlikleri daha hızlı ve daha az yer kaplayacak gösteriyor gibi görünüyor.)

-Kullanıcılara belirli bir kullanıcı hakkında veri almak için izin vermek için dinlendirici bir bitiş noktası göstermek için planı. Bence:

/users/123/name

daha temiz

/users/{af54c891-69ba-4ddf-8cb6-00d368e58d77}/name

Herkes ASP.NET takım Kimliklerini bu şekilde uygulamaya karar verdim niye biliyor mu? Kısa bir int türü için bunu değiştirmek için çalışıyor görüşlü miyim? (Belki faydası vardır kaçırıyorum.)

Teşekkürler...

-Ben

CEVAP
9 Mayıs 2014, Cuma


Kullanarak bir Stefan Cebulak'nın cevap ve Ben Foster'ın büyük blog makale ASP.NET Identity Stripped Bare ASP.NET Kimlik için başvuru yaptım, aşağıdaki gibi bir çözüm geldi, aldım2.0tarafından oluşturulan bir Visual Studio 2013 AccountController.

Çözüm kullanıcıları için birincil anahtar olarak bir tamsayı kullanır ve ayrıca şu anda veritabanı için bir gezi yapmadan kullanıcı giriş KİMLİĞİ almak için izin verir.

İşte adımları takip etmek gerekir:

1. Kullanıcı ile ilgili özel sınıflar oluşturmak

Varsayılan olarak, AccountController birincil anahtar türü olarak string, kullanan sınıfları kullanır. int bir yerine kullanacağı sınıfları aşağıda oluşturmak için ihtiyacımız var. Tek bir dosyada tüm sınıfları aşağıda tanımlanmıştır: AppUser.cs

public class AppUser :
    IdentityUser<int, AppUserLogin, AppUserRole, AppUserClaim>,
    IUser<int>
{

}

public class AppUserLogin : IdentityUserLogin<int> { }

public class AppUserRole : IdentityUserRole<int> { }

public class AppUserClaim : IdentityUserClaim<int> { }

public class AppRole : IdentityRole<int, AppUserRole> { }

Ayrıca kullanışlı, kolay, Kullanıcının KİMLİĞİ ifşa olacak özel bir ClaimsPrincipal sahip olacak

public class AppClaimsPrincipal : ClaimsPrincipal
{
    public AppClaimsPrincipal( ClaimsPrincipal principal ) : base( principal )
    { }

    public int UserId
    {
        get { return int.Parse(this.FindFirst( ClaimTypes.Sid ).Value); }
    }
}

2. Bir özel IdentityDbContext oluşturun

Bizim uygulama veritabanı içeriği varsayılan olarak tüm kimlik doğrulaması ile ilgili DbSets uygulayan IdentityDbContext, taşacak. Eğer DbContext.OnModelCreating boş bir yöntem varsa bile, yani 26**, baskın hakkında emin değilim, base.OnModelCreating( modelBuilder )aramayı unutma AppDbContext.cs

public class AppDbContext :
    IdentityDbContext<AppUser, AppRole, int, AppUserLogin, AppUserRole, AppUserClaim>
{
    public AppDbContext() : base("DefaultConnection")
    {
        // Here use initializer of your choice
        Database.SetInitializer( new CreateDatabaseIfNotExists<AppDbContext>() );
    }


    // Here you define your own DbSet's



    protected override void OnModelCreating( DbModelBuilder modelBuilder )
    {
        base.OnModelCreating( modelBuilder );

        // Here you can put FluentAPI code or add configuration map's
    }
}

3. Özel UserStore yukarıda kullanacağı UserManager, oluşturun

AppUserStore.cs

public interface IAppUserStore : IUserStore<AppUser, int>
{

}

public class AppUserStore :
    UserStore<AppUser, AppRole, int, AppUserLogin, AppUserRole, AppUserClaim>,
    IAppUserStore
{
    public AppUserStore() : base( new AppDbContext() )
    {

    }

    public AppUserStore(AppDbContext context) : base(context)
    {

    }
}

AppUserManager.cs

public class AppUserManager : UserManager<AppUser, int>
{
    public AppUserManager( IAppUserStore store ) : base( store )
    {

    }
}

4. AccountController özel sınıfları kullanmak için değiştirin

Tüm UserManager 38*,* 39 ** AppUserStore vb değiştirin. Kurucular bu: bir örnek alalım

public AccountController()
    : this( new AppUserManager( new AppUserStore( new AppDbContext() ) ) )
{
}

public AccountController(AppUserManager userManager)
{
    UserManager = userManager;
}

5. ClaimIdentity bir iddia çerez gibi depolanan kullanıcı KİMLİĞİ ekleyin

Adım 1, Biz yarattık kullanıcı Kimliği ClaimType.Sid beyan ortaya AppClaimsPrincipal,. Ancak, bu iddianın mevcut olması, kullanıcı giriş yaparken eklemeye ihtiyacımız var. AccountController SingInAsync bir yöntem giriş sorumludur. Bu yöntem için bir satır, iddia eklemeye ihtiyacımız var.

private async Task SignInAsync(AppUser user, bool isPersistent)
{
    AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
    ClaimsIdentity identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);

    // Extend identity claims
    identity.AddClaim( new Claim( ClaimTypes.Sid, user.Id.ToString() ) );

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

6. CurrentUser özelliği BaseController oluşturun

Bir anda kolay bir erişim denetleyicisi kullanıcı KİMLİĞİ, soyut bir oturum oluşturmak hangi denetleyicileri elde edecek BaseController,. BaseController: CurrentUser oluşturun

public abstract class BaseController : Controller
{
    public AppClaimsPrincipal CurrentUser
    {
        get { return new AppClaimsPrincipal( ( ClaimsPrincipal )this.User ); }
    }


    public BaseController()
    {

    }
}

7. BaseController denetleyicileri miras ve keyfini çıkarın

Şu andan itibaren, senin denetleyicileri CurrentUser.UserId şu anda veritabanı geziler olmadan, kullanıcı giriş KİMLİĞİ erişmek için kullanabilirsiniz. Bu, kullanıcıya ait olan nesneleri sorgulamak için kullanabilirsiniz.

Tabloları oluştururken sürpriz, Varlık Çerçevesi tamsayı birincil anahtarlar için Kimlik kullanan kullanıcı birincil anahtar - otomatik nesil ilgilenmek zorunda değilsin.

Uyarı!Zaten serbest projeyi uygulamak için zaten AppClaimsPrincipal 56 *yok* 57 *null döndürür bir kullanıcı oturum unutmayın. Ya tüm kullanıcıların oturum kapatma veya AppClaimsPrincipal bu senaryoyu ele zorlaması gerekir

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Mindy

    Mindy

    20 NİSAN 2006
  • Sams Page :D

    Sams Page :D

    15 Mart 2009
  • TheXiaxue

    TheXiaxue

    3 AĞUSTOS 2009