web-dev-qa-db-ja.com

ASP.NET IDおよびクレーム

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

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

  1. ユーザーの認証-TICK
  2. クレームを作成し、ユーザー情報を保存して、セッション全体で使用できるようにします-いいえ
  3. 新しいASP.NET Rolesテーブルからユーザーの役割を引き出します-ティックではありません

誰もがこれを達成する方法について何か光を当てることができますか?

37
CSharpNewBee

正直なところ、私は自分自身でまだアイデンティティのロープを学んでいます。確かに、Microsoftが提供するドキュメントの方が優れている可能性がありますが、それらのドキュメントがどれほど役立つかはわかりません。最高のものは常にコミュニティからもたらされますが、残念なことに、Identityはまだ非常に新しいため、コミュニティはまだそれを具体化する時間がありました。

とはいえ、ここで私が知っていることは、まだ気付いていないより良い方法があるかもしれないという理解の下でです。

クレーム

UserManagerには、GetClaimsAsyncAddClaimAsync、およびRemoveClaimAsyncの3つの重要な方法があります。

ユーザーのすべての申し立てを取得するには:

var claims = await UserManager.GetClaimsAsync(userId);

現在のユーザーのIDは次の方法で取得できます。

var userId = User.Identity.GetUserId();

クレームを取得したら、特定のクレームを引き出すには:

var someClaim = claims.FirstOrDefault(c => c.Type == "SomeClaimType");

「SomeClaimType」は、追加されたときのクレームの名前です。一部のシナリオでは、これは完全修飾URNである場合もあれば、単なる文字列である場合もあります。個人的に追加したものでない場合、デバッグセッション中にclaims変数を調べて、実際にそこにあるものを確認することをお勧めします。

また、クレームのリストはクエリ可能であるため、WhereCountなど、必要な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);

allロールを取得することは、現時点ではID固有のAPIでは不可能ですが、Entity Frameworkを使用した直接クエリにいつでもフォールバックできます。

var allRoles = context.Roles.OrderBy(o => o.Name);
94
Chris Pratt

Asp.Net Identityについては、「Identity Reboot」と呼ばれるBrock Allenの実装を強くお勧めします。 Identity Rebootは、基本的にASP.NET Identityの一連の拡張機能です。 ASP.NET Identityの実装に不満を感じていたため、インスパイアされました。

入門記事を読むことができます こちら 。ソースコードとサンプルは、github here からダウンロードできます。

Nugetを使用してインストールできます。

www.nuget.org/packages/BrockAllen.IdentityReboot/
www.nuget.org/packages/BrockAllen.IdentityReboot.Ef/   (for entity framework)
5