私は WebForms から離れて、特に新しい ASP.NET Identity モデルを使用して MVC を学習しようとしています。しかし、クレーム オブジェクトを作成し、認証されたユーザーのデータベースに保存する方法を示す Microsoft の正式なドキュメントが見つからないようです。
私のサイトでは、次のことを行う必要があります。
- ユーザーの認証 - チェック
- クレームを作成し、その中にユーザー情報を保存して、セッション全体で使用できるようにします - チェックなし
- 新しい ASP.NET ロール テーブルからユーザー ロールをプルバックします - チェックしません
これを実現する方法について誰か説明できますか?
ベストアンサー1
正直に言うと、私自身も Identity の使い方をまだ学んでいるところです。確かに、Microsoft が提供するドキュメントはもっと良くてもよかったのですが、そのドキュメントがそれほど役に立ったことは一度もありません。最高のものは常にコミュニティから生まれますが、残念ながら Identity はまだ新しいため、コミュニティが十分に具体化する時間はまだありません。
とはいえ、私がまだ気づいていないだけで、もっと良い方法があるかもしれないということを理解した上で、私が知っていることをここに記します。
請求
には、、および のUserManager
3 つの重要性の方法があります。GetClaimsAsync
AddClaimAsync
RemoveClaimAsync
ユーザーのすべてのクレームを取得するには:
var claims = await UserManager.GetClaimsAsync(userId);
現在のユーザーの ID を取得するには、次のようにします。
var userId = User.Identity.GetUserId();
クレームを入手したら、特定のクレームを取り出すには、次の手順を実行します。
var someClaim = claims.FirstOrDefault(c => c.Type == "SomeClaimType");
ここで、「SomeClaimType」は追加されたクレームの名前です。シナリオによっては、これは完全修飾 URN である場合もあれば、単純な文字列である場合もあります。個人的に追加したものでない場合は、claims
デバッグ セッション中に変数を検査して、実際に何が含まれているかを確認するのが最善の方法です。
Where
また、クレームのリストはクエリ可能であるため、、、Count
など、必要な LINQ クエリをほぼすべて実行できます。
新しいクレームを追加するには:
await UserManager.AddClaimAsync(userId, new Claim("SomeClaimType", claimValue));
申し立てを削除するには:
await UserManager.RemoveClaimAsync(userId, someClaim);
役割
ロールも同様に機能します。ユーザーのすべてのロールを取得するには:
var roles = await UserManager.GetRolesAsync(userId);
ユーザーが特定のロールに属しているかどうかを確認するには:
var hasRole = await UserManager.IsInRoleAsync(userId, "SomeRole");
特定のロールにユーザーを追加するには:
await UserManager.AddToRoleAsync(userId, "SomeRole");
削除するには:
await UserManager.RemoveFromRoleAsync(userId, "SomeRole");
最初にロールを追加するのは少し異なり、 のインスタンスを作成する必要がありますRoleStore
。
var roleStore = new RoleStore<IdentityRole>(context);
その後、それを使用してすべてのロールを管理できます。たとえば、新しいロールを作成するには、次のようにします。
await roleStore.CreateAsync(new IdentityRole("RoleName"));
削除する:
var identityRole = await roleStore.FindByNameAsync("RoleName");
await roleStore.DeleteAsync(identityRole);
取得全て現時点では、Identity固有のAPIではロールのクエリは実行できませんが、Entity Frameworkを使用して直接クエリを実行することもできます。
var allRoles = context.Roles.OrderBy(o => o.Name);