2013-10-08 17 views
45

Yeni ASP.NET Kimlik sınıflarındaki arabirimlere ve ilk önce Entity Framework Code ilkesi kullanılarak oluşturduğu veritabanına bakıyorum. Visual Studio 2013 RC kullanıyorum.ASP.NET Identity arabirimleri neden birincil ve yabancı anahtarlar için dizeleri kullanıyor?

enter image description here

Ama bütün tuşlar DEPARTMENTNAME olan

Ve gibi saçma sapan bir AspNetUserSecrets.Id için (128) gibi görünen bir PK: ilk bakışta

veritabanı şeması makul normal görünüyor AspNetUsers tablosunda birden fazla kayda işaret edebilir. Bu, birden çok AspNetUsers'un aynı parolayı paylaşması anlamına mı geliyor?

Sana uygulamak zorunda konum arayüzleri baktığımızda baktığımızda bu ... tüm dizeleri

public class User : IUser 
{ 
    public string Id { get; set; } 
    public string UserName { get; set; } 
} 

public class UserSecret : IUserSecret 
{ 
    public string UserName { get; set; } 
    public string Secret { get; set; } 
} 

public class UserRole : IUserRole 
{ 
    public string UserId { get; set; } 
    public string RoleId { get; set; } 
} 

public class UserClaim : IUserClaim 
{ 
    public string UserId { get; set; } 
    public string ClaimType { get; set; } 
    public string ClaimValue { get; set; } 
} 

public class UserManagement : IUserManagement 
{ 
    public string UserId { get; set; } 
    public bool DisableSignIn { get; set; } 
    public DateTime LastSignInTimeUtc { get; set; } 
} 

public class Tokens : IToken 
{ 
    public string Id { get; set; } 
    public string Value { get; set; } 
    public DateTime ValidUntilUtc { get; set; } 
} 

public class UserLogin : IUserLogin 
{ 
    public string UserId { get; set; } 
    public string LoginProvider { get; set; } 
    public string ProviderKey { get; set; } 
} 

public class Role : IRole 
{ 
    public string Id { get; set; } 
    public string Name { get; set; } 
} 

Ben de uygulamak gerekebilir gerçeği ile yüzleşen ediyorum

Bu PK ve FK ilişkileri için dizeleri kullanarak.

Ama ben gerçekten NEDEN böyle inşa edilmiş olduğunu bilmek isterim ...?

DÜZENLEME: Zaman geçti ve int (veya guıd) kullanmak için asp.net kimliğini uzatmak için nasıl makaleleri şimdi vardır alanları:

http://www.asp.net/identity/overview/extensibility/change-primary-key-for-users-in-aspnet-identity

+0

Bir beta sürümü kullanıyorsunuz. Son versiyon benim anlayışımdan farklı. AspNetUserSecrets tablosunu tamamen kaldırdıklarını duydum. –

+0

Bu sorunlardan birini giderir :) Ama yine de neden tüm anahtarları niçin anlamıyorum NVARCHER (128) ... –

cevap

31

niyet hem izin vermekti isteğe bağlı kimlik türleri (ör. int, guid, string), ancak aynı zamanda id özelliği için serileştirme/döküm sorunlarından kaçınmak.

Yani istediğiniz gibi anahtarlarınızı tanımlayabilir ve sadece Hao söylediklerine ekleme arayüz yöntemi

public class MyUser : IUser { 
    public int Id { get; set; } 
    string IUser.Id { get { return Id.ToString(); } } 
} 
+0

Cevap, bir kişi tarafından içeriden sağlandığından dolayı üzgünüm, şu şekilde işaretlemeliydim uzun zaman önce doğru. –

+0

Neden bir kimliği int olarak kullanmak için gereken tek kod ise, aşağıdaki gibi InEnumerable 'dır: http://typecastexception.com/post/2014/07/13/ASPNET-Identity-20-Extending-Identity -Models-and-Using-Tamsayı-Tuşları-yerine-Strings.aspx her yerde? –

+1

Bu, Identity'nin bakış açısından gerekli olan her şeydir, ilgili uygulama kodu değişikliklerinin bir kısmı olacaktır. Bu genel olarak oldukça ezici bir durumdu ve biz de bunu zaten bir Kimlik V3'te basitleştirmeyi denedik. –

16

uygulamak:

  1. Kimlik çalışma zamanı kullanıcı kimliği için dizeleri tercih çünkü biz don Kullanıcı ID'lerinin doğru bir şekilde serileştirilmesini (aynı sebepten ötürü iddialar için dizeler kullanıyoruz) işinde olmak isteriz. Kimlik arayüzlerinin tümü (veya çoğu) kullanıcı kimliğine bir dize olarak başvurur. Kalıcı tabakayı kişiselleştiren insanlar, ör. Varlık türleri, anahtarlar için istedikleri türü seçebilir, ancak daha sonra anahtarların dize olarak temsil edilmesini sağlarlar.
  2. Varsayılan olarak, her yeni kullanıcı için GUID'lerin dize olarak temsilini kullanıyoruz, ancak bu, yalnızca benzersiz kimlikleri otomatik olarak üretmemiz için çok kolay bir yol sağladığı için.
+1

Bu C# için zaman dönüş türü de dayalı farklı yöntem imzaları uygulamak için zamanı. Bu bir sınırlama olduğundan, microsoft bir Identity.EntityFramework.Int paketi, bir GuiD ve tüm seçenekleri oluşturamaz mı? –

+1

@Rick Neden nvarchar (128) benzersiz tanımlayıcıdan ziyade? –

2

ASP.NET Core ile, Identity modellerinde istediğiniz veri türünü belirtmenin çok kolay bir yolu vardır.

public class ApplicationUser : IdentityUser<Guid> 
{ 
} 

public class ApplicationRole : IdentityRole<Guid> 
{ 
} 

sizin sınıfları kullanarak, veritabanı içeriğinde beyan ve veri istediğiniz yazın::

İlk adım, geçersiz kılma kimlik sınıfları < dizesinden>-< verilerini> istediğiniz tip

public class ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, Guid> 
    { 
     public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) 
      : base(options) 
     { 
     } 

     protected override void OnModelCreating(ModelBuilder builder) 
     { 
      base.OnModelCreating(builder); 
      // Customize the ASP.NET Identity model and override the defaults if needed. 
      // For example, you can rename the ASP.NET Identity table names and more. 
      // Add your customizations after calling base.OnModelCreating(builder); 
     } 
    } 

Ve başlangıç ​​sınıfınızda, modellerinizi kullanarak kimlik hizmetini bildirin ve prim için istediğiniz veri türünü bildirin. li tuşları:

ASP.NET kimlik tablolarda
services.AddIdentity<ApplicationUser, ApplicationRole>() 
      .AddEntityFrameworkStores<ApplicationDbContext, Guid>() 
      .AddDefaultTokenProviders(); 

, birincil anahtarlar hala NVARCHAR olacak ama uygulamanız için bu İstediğiniz veri türü olacak bu. Bunu bir denetleyicide denetleyebilirsiniz:

[HttpGet] 
    public async Task<IActionResult> Test() 
    { 
     ApplicationUser user = await _userManager.GetUserAsync(HttpContext.User); 
     Guid userId = user.Id; // No cast from string, it's a Guid data type 
     throw new NotImplementedException(); 
    } 
+1

Resmi belgede bu yanıttan beri bir makale var: https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity-primary-key-configuration – AdrienTorris

+0

Ya ben istemiyorum Rolleri tanımlayın, ACL tarafından rolleri ele alıyoruz. – Khalil

İlgili konular