新しいASP.NET Identityシステム(1.0)にロールを追加するにはどうすればよいですか? UserStore
クラスはありますが、RoleStore
クラスはありません。
この問題に関するドキュメントは見つかりません。
RoleManager = new RoleManager<IdentityRole>(
new RoleStore<IdentityRole>(new MyDbContext()));
var roleresult = RoleManager.Create(new IdentityRole(roleName));
.NET Framework 4.5以降、Windows Identity Foundation(WIF)は.NET Frameworkに完全に統合されました。
私は、クレーム( クレームをロールとして表現する )を使用して承認を実装する可能性を検討することをお勧めします。
IsInRole()メソッドが呼び出されると、現在のユーザーがそのロールを持っているかどうかを確認するチェックが行われます。要求に対応するアプリケーションでは、役割は、トークンで使用可能な役割要求の種類で表されます。
役割要求の種類は、次のURIを使用して表現されます。 " http://schemas.Microsoft.com/ws/2008/06/identity/claims/role "
UserManagerから次のようなことができます(RoleManagerなし):
var um = new UserManager();
um.AddClaimAsync(1, new Claim(ClaimTypes.Role, "administrator"));
クレームは、認証および承認プロセスのパフォーマンスを簡素化し、向上させることができます。クレームとして保存されたロールを使用して、承認が行われるたびにバックエンドクエリを排除できます。
クレームを使用すると、RoleStoreはもう必要ありません(少なくとも同等の承認目的では...)
1つのサンプルasp.net Webページで以下のスニペットを使用しましたpage_load方法の把握を開始するためにASP Identity works
UserManager userManager = new UserManager();
var roleStore = new RoleStore<IdentityRole>(new ApplicationDbContext());
var roleManager = new RoleManager<IdentityRole>(roleStore);
var applicationRoleAdministrator = new IdentityRole("superadmin");
if (!roleManager.RoleExists(applicationRoleAdministrator.Name))
{
roleManager.Create(applicationRoleAdministrator);
}
ApplicationUser applicationUserAdministrator = userManager.FindByName(User.Identity.Name);
if (!userManager.GetRoles(applicationUserAdministrator.Id).Contains("superadmin"))
{
Response.Redirect("~/account/login.aspx?ReturnUrl=" + Request.Url.AbsolutePath);
}
もちろん、以下のApplicationDbContextは、以下のようなASP.NET 4.5+テンプレートで自動的に生成されます
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("DefaultConnection")
{
}
}
また、アプリケーションロールマネージャークラスも作成します
public class ApplicationRoleManager : RoleManager<IdentityRole>
{
public ApplicationRoleManager(IRoleStore<IdentityRole, string> roleStore)
: base(roleStore)
{
}
public static ApplicationRoleManager Create(IdentityFactoryOptions<ApplicationRoleManager> options, IOwinContext context)
{
//return new ApplicationRoleManager(new RoleStore<IdentityRole>(context.Get<ApplicationDbContext>()));
return new ApplicationRoleManager(new RoleStore<IdentityRole>(new ApplicationDbContext()));
}
}
また、startup.Auth.cs => ConfigureAuth(IAppBuilder app)メソッドに以下の行を追加します
app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);
そしてコントローラーで:
private ApplicationRoleManager _roleManager;
public ApplicationRoleManager RoleManager
{
get
{
return _roleManager ?? HttpContext.GetOwinContext().Get<ApplicationRoleManager>();
}
private set
{
_roleManager = value;
}
}
私はこのIdentity Stuffに不慣れであり、それが必要なのか、それともクリーンで正しいことをしているのかはわかりませんが、これらの手順はうまくいきました
ASP.NET IDは、ロールに関してクレームに対応しています。以前のシステムではweb.configでメンバーシップとロールプロバイダーを構成していたため、それは本当に混乱しました。
私にとっての問題は、次のようなコードがあることです。
HttpContext.Current.User.IsInRole("some role")
幸いなことに、このロジックは引き続き機能します。 Microsoft.AspNet.Identity.Core
にあるClaimsIdentityFactory.csのCreateAsync
関数でロジックを確認できます。引数の1つはUserManager
です。 SupportsUserRole
かどうかを尋ね、そうであればGetRolesAsync
を呼び出し、ClaimIdentity
へのクレームとして各ロールを追加します。これを自分で行う必要はありません。
IsInRole
は、ここで説明するようにクレームを使用します。