2017-02-17 1 views
1

私は単純なサンドボックスプロジェクトを持っています.net Core Identityの仕組みをよりよく理解するために使用していますが、私は誰かが説明できるように少し矛盾しています。このプロジェクトはEntity Frameworkを使用しています。アイデンティティのロールが設定されていません

https://medium.com/@goodealsnow/asp-net-core-identity-3-0-6018fc151b4#.2env44446私はこの awesome awesomeプロジェクトを設定するのに役立つ記事を使用しました。ユーザクラスは次のとおりです。

public class User : IdentityUser<int> 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string TempPassword { get; set; } 
} 

私は3人のユーザーと3つの役割、各役割に1人のユーザー、「所有者」、「管理者」、および「ユーザー」とデシベルを播種しました。私は

auth.AddPolicy("Owner", policy => 
{ 
    policy.RequireAuthenticatedUser(); 
    policy.RequireRole("Owner"); 
}); 

auth.AddPolicy("Admin", policy => 
{ 
    policy.RequireAuthenticatedUser(); 
    policy.RequireRole("Admin", "Owner"); 
}); 

auth.AddPolicy("User", policy => 
{ 
    policy.RequireAuthenticatedUser(); 
}); 

ので[Authorize("Admin")]仕事のように私の属性は素晴らしい、私の行動のためのいくつかのポリシーを追加しました。私もそう

public static class PrincipalExtensions 
{ 
    public static bool IsOwner(this ClaimsPrincipal principal) 
    { 
     return principal.IsInRole("Owner"); 
    } 

    public static bool IsAdmin(this ClaimsPrincipal principal) 
    { 
     return principal.IsInRole("Admin") || principal.IsInRole("Owner"); 
    } 

    public static bool IsUser(this ClaimsPrincipal principal) 
    { 
     return principal.Identity.IsAuthenticated; 
    } 
} 

ので、私はif(User.IsAdmin())を行うことができ、これは同様に完璧に動作など、いくつかの主要な機能拡張を追加しました。それは奇妙な取得する場所ここで

は、私は次のコードをステップ実行した場合、私は混乱の結果を得る...

です。

var user = await _userManager.GetUserAsync(User);    
var userRoles = await _userManager.GetRolesAsync(user); 
await _userManager.AddToRoleAsync(user, "Owner"); 

最初の行には私にUserオブジェクトがあります。そのオブジェクトにはロール(user.Roles)のコレクションがありますが、ユーザーにロールがありますが、空(Count = 0)と表示されます。

2行目は、ユーザーのRolesを取得し、正しく入力されます。

3番目の行がユーザーに「所有者」ロールを追加し、正しく機能する(dbが更新されます)だけでなく、ローカル変数userが突然この役割をuser.Rolesに持っています!ユーザーの他の役割はまったく表示されないことに注意してください。

私は基本的に2つの質問があります:1. userオブジェクトの先頭にはuser.Rolesが含まれていないのはなぜですか? 2.役割を追加した後に突然同期されるのはなぜですか?

何か助けていただければ幸いです。

答えて

1

RolesEntityFramework Identity UserStoreは情報を要求していないため、GetUserAsync()を呼び出した後でコレクションに入力されません。 DbContextで直接ユーザーデータにアクセスし、Include()を呼び出していない場合に相当します。

今すぐEF Core does not support lazy loadingとなり、したがって、user.Rolesナビゲーションプロパティは自動的に設定されません。そして、はい、これは現時点ではやや不快な動作になります。

GetRolesAsync()およびAddToRoleAsync()への電話では、ロールで直接操作しているため、データが明示的に入力されています。

+0

リンクありがとうございます。最初は、「なぜそれをオブジェクトに入れるのではなく、なぜそれをオブジェクトに置くのですか」と言うことになりましたが、そのページのバックログセクションには、それが来ると言います。 – nurdyguy

+0

ええ、最高の、 'ユーザー。Roles'は読み込み専用ですので、自分でも読み込むことはできません! – nurdyguy

関連する問題