ASP.NET アイデンティティとクレーム 質問する

ASP.NET アイデンティティとクレーム 質問する

私は WebForms から離れて、特に新しい ASP.NET Identity モデルを使用して MVC を学習しようとしています。しかし、クレーム オブジェクトを作成し、認証されたユーザーのデータベースに保存する方法を示す Microsoft の正式なドキュメントが見つからないようです。

私のサイトでは、次のことを行う必要があります。

  1. ユーザーの認証 - チェック
  2. クレームを作成し、その中にユーザー情報を保存して、セッション全体で使用できるようにします - チェックなし
  3. 新しい ASP.NET ロール テーブルからユーザー ロールをプルバックします - チェックしません

これを実現する方法について誰か説明できますか?

ベストアンサー1

正直に言うと、私自身も Identity の使い方をまだ学んでいるところです。確かに、Microsoft が提供するドキュメントはもっと良くてもよかったのですが、そのドキュメントがそれほど役に立ったことは一度もありません。最高のものは常にコミュニティから生まれますが、残念ながら Identity はまだ新しいため、コミュニティが十分に具体化する時間はまだありません。

とはいえ、私がまだ気づいていないだけで、もっと良い方法があるかもしれないということを理解した上で、私が知っていることをここに記します。

請求

には、、および のUserManager3 つの重要性の方法があります。GetClaimsAsyncAddClaimAsyncRemoveClaimAsync

ユーザーのすべてのクレームを取得するには:

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

おすすめ記事