2013-10-08 32 views
45

新しいASP.NET IDクラスのインターフェイスと、Entity Frameworkコードファーストを使用して作成したデータベースを見ています。私はVisual Studio 2013 RCを使用しています。データベーススキーマが合理的にノーマルに見える一見ASP.NET IDインターフェイスでプライマリおよび外部キーの文字列が使用されるのはなぜですか?

enter image description here

しかし、すべてのキーがNVARCHAR(128)

されており、いくつかのクレイジーな理由AspNetUserSecrets.Idのためにのように見えるPKですAspNetUsersテーブルの複数のレコードを指すことができます。これは複数のAspNetUsersが同じパスワードを共有する必要があることを意味しますか?

私はあなたが実装することを強制しているインターフェースを見て見てみると、これらはすべて文字列です...

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

だから私は、私が実装しなければならない可能性があるという事実を条件に来ていますこれは、PKとFKの関係に文字列を使用します。

しかし、私はそれがなぜこのように構築されているのか知りたいです... ...?

EDIT:時間が経過し、int型(またはGUID)を使用してasp.netのアイデンティティを拡張する方法についての記事が今そこにあるフィールド:

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

+0

ベータ版を使用しています。最終版は私の理解とは異なります。 AspNetUserSecretsテーブルを完全に削除したと聞いています。 –

+0

さて、問題の1つを修正します:)しかし、私はまだすべてのキーがNVARCHER(128)である理由を理解できません... –

答えて

31

意図は、両方できるようになりました任意のid型(つまりint、​​、string)ですが、idプロパティのシリアライズ/キャストの問題は避けてください。

だからあなたはあなたが好きしかし、あなたの鍵を定義することができ、ちょうどハオが言ったに追加するインターフェイスメソッド

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

申し訳ありませんが、答えが内部の人によって提供されたので、正しい長い前に。 –

+0

なぜこれがidをintとして使用するために必要な唯一のコードであれば、次のように 'InEnumerable 'があります:http://typecastexception.com/post/2014/07/13/ASPNET-Identity-20-Extending-Identity Model-and-Integer-Keys-代わりにStrings.aspxの代わりに使用しますか? –

+1

アイデンティティの観点から必要なのは、対応するアプリケーションコードの変更です。これは一般的にかなり圧倒的でした。私たちはこれをアイデンティティV3の束に単純化しようとしました。 –

16

を実装:

  1. アイデンティティランタイムはユーザーIDの文字列を好む理由は、我々ドンユーザーIDの適切なシリアル化を計算するビジネスになりたい(同じ理由で、同様の主張のために文字列を使用します)。すべての(またはほとんどの)アイデンティティインタフェースはユーザIDを文字列として参照します。
  2. パーシスタンスレイヤをカスタマイズするユーザー(例:エンティティタイプは、キーに必要なタイプを選択できますが、キーの文字列表現を提供しています。
  3. デフォルトでは、新しいユーザーごとにGUIDの文字列表現を使用していますが、それは非常に簡単な方法で固有のIDを自動的に生成できるからです。
+1

これは、戻り値の型にも基づいて異なるメソッドシグネチャを実装するための時間です。これは制限事項なので、Identity.EntityFramework.Intパッケージ、GuiD、およびすべてのオプションをMicrosoftが作成することはできませんか? –

+1

@Rickなぜuniqueidentifierではなくnvarchar(128)ですか? –

2

ASP.NETコアを使用すると、Identityのモデルに必要なデータ型を簡単に指定できます。

まずステップ、<文字列> < へのデータからIDのクラスは、あなたがしたい入力上書き>

public class ApplicationUser : IdentityUser<Guid> 
{ 
} 

public class ApplicationRole : IdentityRole<Guid> 
{ 
} 

は、あなたのクラスやデータを使用して、データベースのコンテキストを宣言したい入力します。

あなたのスタートアップクラスで、モデルを使用してIDサービスを宣言し、プリム用に必要なデータ型を宣言します進キー:ASP.NETのIDテーブルで

services.AddIdentity<ApplicationUser, ApplicationRole>() 
      .AddEntityFrameworkStores<ApplicationDbContext, Guid>() 
      .AddDefaultTokenProviders(); 

、主キーはまだNVARCHARになりますが、あなたのアプリケーションでは、必要なデータ・タイプになりますです。 コントローラでこれを確認できます。

[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

公式文書には、この回答以来の記事があります:https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity-primary-key-configuration – AdrienTorris

+0

どうしたらいいですか?ロールを定義します。我々はACLによってロールを処理しています。 – Khalil

関連する問題