2016-11-23 13 views
1

私はAsp.net Core Identityを使用している小さなテストアプリケーションを持っています。私は特定のシステムの役割が整っていることを確認し、スタートアップで :それが存在しない場合はAddToRoleAsyncはロールを見つけることができません

if(await _roleManager.FindByNameAsync(“SYSADMIN”) == null) 
{ 
    _context.Roles.Add(new IdentityRole(“SYSADMIN”)); 
    await _context.SaveChangesAsync(); 
} 

それから私はチェックして、システム管理者アカウントを作成します。

var result = await _userManager.CreateAsync(adminUser, config["AdminPassword"]); 

私は、それを試してみて追加SYSADMINロールへのユーザー:

if (result == IdentityResult.Success) 
{     
    await _userManager.AddToRoleAsync(adminUser, “SYSADMIN”); 
} 

ただし、ロールが存在しないというエラーが表示されます。しかし、私はAspNetRolesに上記の名前の役割を見ることができますし、私は2回目にアプリケーションを実行すると_roleManager.FindByNameAsyncがロールを返すので、_context.Roles.Add()セクションには入りません。

誰もこの動作を以前に見たことがありますか、それが失敗する理由は何ですか?

編集 私は、正規化された名前がDBにもかかわらずnullであることに気づきました。

+1

私は、あなたが矛盾しているように見えて、ロール名をあらかじめ正規化しようとしています。 IDPPlatform.System.Roles.OrgAdminがSYSADMINに正規化される文字列定数であれば、どこでも定数を使用するだけです。 _roleManager.FindByNameAsyncのようなメソッドはメソッド内で正規化しますので、事前に正規化する必要はありません。 _userManager.AddToRoleAsyncと同じ –

+0

残念ですが、コピー/貼り付けエラーです。これは "SYSADMIN"に解決され、定数は実際にどこでも使用されています。この例では、SQL Serverの名前列に配置される文字列であることを示すために置き換えられました。私は、正規化された名前がDBにもかかわらずヌルであることに気付いています - これは一致するために使用されているものですか? – LDJ

答えて

2

これは私のバグのようです。文字列のみを取るコンストラクタを使用すると、正規化された名前ではなく名前が設定されます。正規化された名前がAddToRoleAsyncにマッチするように見えるので、うまく動作しません。

私は移入するNormalizedNameを強制するには、次の使用に必要な:

_context.Roles.Add(new IdentityRole("SYSADMIN") 
{ 
    NormalizedName = "SYSADMIN" 
}); 

そしてその作業は今を。 私はチームにバグを報告し、うまくいけば修正されるでしょう。

+0

私は同じ問題を抱えていました。回避策をありがとう。おそらく、これはまさにそれが動作する方法です。 – abedon

関連する問題